of requiring to specify a maximum mbuffer size at creation.
ticket_len = KEY_NAME_SIZE + IV_SIZE + 2 + ticket.encrypted_state_len
+ MAC_SIZE;
- bufel = _gnutls_handshake_alloc (4 + 2 + ticket_len);
+ bufel = _gnutls_handshake_alloc (4 + 2 + ticket_len, 4+2+ticket_len);
if (!bufel)
{
gnutls_assert ();
if (again == 0)
{
- bufel = _gnutls_handshake_alloc (MAX_VERIFY_DATA_SIZE);
+ bufel = _gnutls_handshake_alloc (MAX_VERIFY_DATA_SIZE, MAX_VERIFY_DATA_SIZE);
if (bufel == NULL)
{
gnutls_assert ();
if (again == 0)
{
- bufel = _gnutls_handshake_alloc (0);
+ bufel = _gnutls_handshake_alloc (0, 0);
if (bufel == NULL)
{
gnutls_assert ();
/* This should be sufficient by now. It should hold all the extensions
* plus the headers in a hello message.
*/
-#define MAX_EXT_DATA_LENGTH 65535
+#define MAX_EXT_DATA_LENGTH 32*1024
/* This function sends the client hello handshake message.
*/
/* 2 for version, (4 for unix time + 28 for random bytes==GNUTLS_RANDOM_SIZE)
*/
- bufel = _gnutls_handshake_alloc (datalen);
+ bufel = _gnutls_handshake_alloc (datalen, datalen+MAX_EXT_DATA_LENGTH);
if (bufel == NULL)
{
gnutls_assert ();
if (ret > 0)
{
- bufel = _mbuffer_push_data (bufel, extdata, ret);
- if (bufel == NULL)
+ ret = _mbuffer_append_data (bufel, extdata, ret);
+ if (ret < 0)
{
gnutls_assert ();
gnutls_free (extdata);
- return GNUTLS_E_MEMORY_ERROR;
+ return ret;
}
}
else
ret = _gnutls_copy_comp_methods (session, extdata, extdatalen);
if (ret > 0)
{
- bufel = _mbuffer_push_data (bufel, extdata, ret);
- if (bufel == NULL)
+ ret = _mbuffer_append_data (bufel, extdata, ret);
+ if (ret < 0)
{
gnutls_assert ();
gnutls_free (extdata);
- return GNUTLS_E_MEMORY_ERROR;
+ return ret;
}
}
else
if (ret > 0)
{
- bufel = _mbuffer_push_data (bufel, extdata, ret);
- if (bufel == NULL)
+ ret = _mbuffer_append_data (bufel, extdata, ret);
+ if (ret < 0)
{
gnutls_assert ();
gnutls_free (extdata);
- return GNUTLS_E_MEMORY_ERROR;
+ return ret;
}
}
else if (ret < 0)
}
extdatalen = ret;
- bufel = _gnutls_handshake_alloc (datalen + extdatalen);
+ bufel = _gnutls_handshake_alloc (datalen + extdatalen, datalen + extdatalen);
if (bufel == NULL)
{
gnutls_assert ();
return ret;
}
- bufel = _gnutls_handshake_alloc(buf.length);
+ bufel = _gnutls_handshake_alloc(buf.length, buf.length);
if (bufel == NULL)
{
gnutls_assert ();
head of the queue. */
size_t mark;
unsigned int user_mark; /* only used during fill in */
+ size_t maximum_size;
} mbuffer_st;
typedef struct mbuffer_head_st
return GNUTLS_E_INVALID_REQUEST;
}
- bufel = _gnutls_handshake_alloc(size);
+ bufel = _gnutls_handshake_alloc(size, size);
if (bufel == NULL)
{
gnutls_assert ();
}
mbuffer_st *
-_mbuffer_alloc (size_t payload_size)
+_mbuffer_alloc (size_t payload_size, size_t maximum_size)
{
mbuffer_st * st;
- st = gnutls_malloc (payload_size+sizeof (mbuffer_st));
+ st = gnutls_malloc (maximum_size+sizeof (mbuffer_st));
if (st == NULL)
{
gnutls_assert ();
st->mark = 0;
st->user_mark = 0;
st->next = NULL;
+ st->maximum_size = maximum_size;
return st;
}
-mbuffer_st*
-_mbuffer_push_data (mbuffer_st *bufel, void* newdata, size_t newdata_size)
+int
+_mbuffer_append_data (mbuffer_st *bufel, void* newdata, size_t newdata_size)
{
- bufel = gnutls_realloc_fast (bufel, bufel->msg.size+newdata_size+sizeof (mbuffer_st));
- if (bufel == NULL)
+ if (sizeof(mbuffer_st)+bufel->msg.size+newdata_size < bufel->maximum_size)
{
- gnutls_assert ();
- return NULL;
+ memcpy(&bufel->msg.data[bufel->msg.size], newdata, newdata_size);
+ bufel->msg.size+=newdata_size;
+ }
+ else
+ {
+ gnutls_assert();
+ return GNUTLS_E_INVALID_REQUEST;
}
- bufel->msg.data = (opaque*)bufel + sizeof (mbuffer_st);
- memcpy(&bufel->msg.data[bufel->msg.size], newdata, newdata_size);
- bufel->msg.size += newdata_size;
- return bufel;
+ return 0;
}
void _mbuffer_enqueue (mbuffer_head_st *buf, mbuffer_st *bufel);
void _mbuffer_get_head (mbuffer_head_st *buf, gnutls_datum_t *msg);
int _mbuffer_remove_bytes (mbuffer_head_st *buf, size_t bytes);
-mbuffer_st* _mbuffer_alloc (size_t payload_size);
+mbuffer_st* _mbuffer_alloc (size_t payload_size, size_t maximum_size);
/* This is dangerous since it will replace bufel with a new
* one.
*/
-mbuffer_st* _mbuffer_push_data (mbuffer_st *bufel, void* newdata, size_t newdata_size);
+int _mbuffer_append_data (mbuffer_st *bufel, void* newdata, size_t newdata_size);
/* For "user" use. One can have buffer data and header.
-inline static mbuffer_st* _gnutls_handshake_alloc(size_t size)
+inline static mbuffer_st* _gnutls_handshake_alloc(size_t size, size_t maximum)
{
- mbuffer_st *ret = _mbuffer_alloc (HANDSHAKE_HEADER_SIZE + size);
+ mbuffer_st *ret = _mbuffer_alloc (HANDSHAKE_HEADER_SIZE + size, HANDSHAKE_HEADER_SIZE+maximum);
if (!ret)
return NULL;
/* now proceed to packet encryption
*/
cipher_size = data2send_size + MAX_RECORD_OVERHEAD;
- bufel = _mbuffer_alloc (cipher_size);
+ bufel = _mbuffer_alloc (cipher_size, cipher_size);
if (bufel == NULL)
{
gnutls_assert ();