summaryrefslogtreecommitdiff
path: root/lib/extensions.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/extensions.c')
-rw-r--r--lib/extensions.c27
1 files changed, 16 insertions, 11 deletions
diff --git a/lib/extensions.c b/lib/extensions.c
index b4c2284f9a..bd4f933fb7 100644
--- a/lib/extensions.c
+++ b/lib/extensions.c
@@ -293,7 +293,8 @@ static
int send_extension(gnutls_session_t session, const extension_entry_st *p,
gnutls_buffer_st *extdata, gnutls_ext_parse_type_t parse_type)
{
- int size_pos, size, ret;
+ int size_pos, appended, ret;
+ size_t size_prev;
if (p->send_func == NULL)
return 0;
@@ -323,16 +324,23 @@ int send_extension(gnutls_session_t session, const extension_entry_st *p,
if (ret < 0)
return gnutls_assert_val(ret);
- size = p->send_func(session, extdata);
+ size_prev = extdata->length;
+ ret = p->send_func(session, extdata);
+ if (ret < 0 && ret != GNUTLS_E_INT_RET_0) {
+ return gnutls_assert_val(ret);
+ }
+
/* returning GNUTLS_E_INT_RET_0 means to send an empty
* extension of this type.
*/
- if (size > 0 || size == GNUTLS_E_INT_RET_0) {
- if (size == GNUTLS_E_INT_RET_0)
- size = 0;
+ appended = extdata->length - size_prev;
+
+ if (appended > 0 || ret == GNUTLS_E_INT_RET_0) {
+ if (ret == GNUTLS_E_INT_RET_0)
+ appended = 0;
/* write the real size */
- _gnutls_write_uint16(size,
+ _gnutls_write_uint16(appended,
&extdata->data[size_pos]);
/* add this extension to the extension list
@@ -342,11 +350,8 @@ int send_extension(gnutls_session_t session, const extension_entry_st *p,
_gnutls_handshake_log
("EXT[%p]: Sending extension %s (%d bytes)\n",
- session, p->name, size);
- } else if (size < 0) {
- gnutls_assert();
- return size;
- } else if (size == 0)
+ session, p->name, appended);
+ } else if (appended == 0)
extdata->length -= 4; /* reset type and size */
return 0;