From: Nikos Mavrogiannopoulos Date: Wed, 2 Jun 2010 22:59:39 +0000 (+0200) Subject: Some other changes to mbuffers to make gnutls (a bit more) agnostic on their internal... X-Git-Tag: gnutls_2_11_3~196 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=5b2ef1f508289e618825cb05ebc864492b0db7de;p=thirdparty%2Fgnutls.git Some other changes to mbuffers to make gnutls (a bit more) agnostic on their internal structure. --- diff --git a/lib/gnutls_handshake.c b/lib/gnutls_handshake.c index cddeef7f0d..e03280cc34 100644 --- a/lib/gnutls_handshake.c +++ b/lib/gnutls_handshake.c @@ -674,7 +674,7 @@ _gnutls_send_finished (gnutls_session_t session, int again) if (again == 0) { - bufel = _gnutls_handshake_alloc (36); + bufel = _gnutls_handshake_alloc (MAX_VERIFY_DATA_SIZE); if (bufel == NULL) { gnutls_assert (); @@ -1156,8 +1156,8 @@ _gnutls_send_handshake (gnutls_session_t session, mbuffer_st *bufel, } /* first run */ - data = bufel->msg.data; - datasize = bufel->msg.size; + data = _mbuffer_get_uhead_ptr(bufel); + datasize = _mbuffer_get_udata_size(bufel) + _mbuffer_get_uhead_size(bufel); data[pos++] = (uint8_t) type; _gnutls_write_uint24 (bufel->msg.size - bufel->mark, &data[pos]); diff --git a/lib/gnutls_mbuffers.h b/lib/gnutls_mbuffers.h index 6c6fb9d29c..a1a6065328 100644 --- a/lib/gnutls_mbuffers.h +++ b/lib/gnutls_mbuffers.h @@ -27,12 +27,69 @@ #include "gnutls_int.h" -void _gnutls_mbuffer_init (mbuffer_head_st *buf); -void _gnutls_mbuffer_clear (mbuffer_head_st *buf); -void _gnutls_mbuffer_enqueue (mbuffer_head_st *buf, mbuffer_st *bufel); -void _gnutls_mbuffer_get_head (mbuffer_head_st *buf, gnutls_datum_t *msg); -int _gnutls_mbuffer_remove_bytes (mbuffer_head_st *buf, size_t bytes); -mbuffer_st* _gnutls_mbuffer_alloc (size_t payload_size); -mbuffer_st* _gnutls_mbuffer_realloc (mbuffer_st *bufel, size_t payload_size); +void _mbuffer_init (mbuffer_head_st *buf); +void _mbuffer_clear (mbuffer_head_st *buf); +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); + +/* This is dangerous since it will replace bufel with a new + * one. + */ +mbuffer_st* _mbuffer_append_data (mbuffer_st *bufel, void* newdata, size_t newdata_size); + + +/* For "user" use. One can have buffer data and header. + */ + +inline static void _mbuffer_set_udata(mbuffer_st *bufel, void* data, size_t data_size) +{ + memcpy(bufel->msg.data + bufel->user_mark, data, data_size); +} + +inline static void* _mbuffer_get_uhead_ptr(mbuffer_st *bufel) +{ + return bufel->msg.data; +} + +inline static void* _mbuffer_get_udata_ptr(mbuffer_st *bufel) +{ + return bufel->msg.data + bufel->user_mark; +} + +inline static void _mbuffer_set_udata_size(mbuffer_st *bufel, size_t size) +{ + bufel->msg.size = size + bufel->user_mark; +} + +inline static size_t _mbuffer_get_udata_size(mbuffer_st *bufel) +{ + return bufel->msg.size - bufel->user_mark; +} + +inline static size_t _mbuffer_get_uhead_size(mbuffer_st *bufel) +{ + return bufel->user_mark; +} + +inline static void _mbuffer_set_uhead_size(mbuffer_st *bufel, size_t size) +{ + bufel->user_mark = size; +} + + + +inline static mbuffer_st* _gnutls_handshake_alloc(size_t size) +{ + mbuffer_st *ret = _mbuffer_alloc (HANDSHAKE_HEADER_SIZE + size); + + if (!ret) + return NULL; + + _mbuffer_set_uhead_size(ret, HANDSHAKE_HEADER_SIZE); + + return ret; +} #endif diff --git a/lib/gnutls_record.c b/lib/gnutls_record.c index ba4b88e5b1..1209e0d4b8 100644 --- a/lib/gnutls_record.c +++ b/lib/gnutls_record.c @@ -409,7 +409,7 @@ _gnutls_send_int (gnutls_session_t session, content_type_t type, cipher_size = _gnutls_encrypt (session, headers, RECORD_HEADER_SIZE, data, - data2send_size, bufel->msg.data, cipher_size, type, + data2send_size, _mbuffer_get_udata_ptr(bufel), cipher_size, type, (session->internals.priorities.no_padding == 0) ? 1 : 0); if (cipher_size <= 0) @@ -434,7 +434,7 @@ _gnutls_send_int (gnutls_session_t session, content_type_t type, return GNUTLS_E_RECORD_LIMIT_REACHED; } - bufel->msg.size = cipher_size; + _mbuffer_set_udata_size(bufel, cipher_size); ret = _gnutls_io_write_buffered (session, bufel); }