]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
Fix DTLS handshake when first fragment is 1 byte
authorStephen Paul Weber <singpolyma@singpolyma.net>
Wed, 5 Jul 2023 03:28:48 +0000 (22:28 -0500)
committerStephen Paul Weber <singpolyma@singpolyma.net>
Wed, 5 Jul 2023 03:34:53 +0000 (22:34 -0500)
Asterisk sometimes generates this, and it seems like a valid case.  If
the first fragment is 1 byte then subsequent fragments will still try to
merge into it so it needs to have a big enough buffer for this to happen.

Signed-off-by: Stephen Paul Weber <singpolyma@singpolyma.net>
lib/buffers.c

index 5f5b15fb97a141682416d99605b165e6fed34657..93055e5b83dc2889e8019b289252da23b7acec8c 100644 (file)
@@ -984,14 +984,16 @@ static int merge_handshake_packet(gnutls_session_t session,
                return gnutls_assert_val(GNUTLS_E_TOO_MANY_HANDSHAKE_PACKETS);
 
        if (!exists) {
-               if (hsk->length > 0 && hsk->end_offset > 0 &&
-                   hsk->end_offset - hsk->start_offset + 1 != hsk->length) {
+               if (hsk->length != hsk->data.length) {
                        ret = _gnutls_buffer_resize(&hsk->data, hsk->length);
                        if (ret < 0)
                                return gnutls_assert_val(ret);
 
                        hsk->data.length = hsk->length;
+               }
 
+               if (hsk->length > 0 && hsk->end_offset > 0 &&
+                   hsk->end_offset - hsk->start_offset + 1 != hsk->length) {
                        memmove(&hsk->data.data[hsk->start_offset],
                                hsk->data.data,
                                hsk->end_offset - hsk->start_offset + 1);