]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
hello_ext: use 64-bit integer to track extensions
authorDaiki Ueno <dueno@redhat.com>
Sun, 1 Mar 2020 09:16:08 +0000 (10:16 +0100)
committerDaiki Ueno <dueno@redhat.com>
Tue, 10 Mar 2020 14:29:38 +0000 (15:29 +0100)
We currently have 26 predefined extensions, allowing the user to
define 5 extra as tested in tests/handshake-large-packet.c.  However,
if we introduce one more, session->internals.used_exts exceeds.

Signed-off-by: Daiki Ueno <dueno@redhat.com>
lib/gnutls_int.h
lib/hello_ext.c
lib/hello_ext.h

index d9d851be627cda3789061a1d55e685816a1cef86..058fce090c352b9c68e88f7009eb59fc76b2e2ef 100644 (file)
@@ -146,7 +146,7 @@ typedef int ssize_t;
 /* TLS Extensions */
 /* we can receive up to MAX_EXT_TYPES extensions.
  */
-#define MAX_EXT_TYPES 32
+#define MAX_EXT_TYPES 64
 
 /* TLS-internal extension (will be parsed after a ciphersuite is selected).
  * This amends the gnutls_ext_parse_type_t. Not exported yet to allow more refining
@@ -358,8 +358,8 @@ typedef enum extensions_t {
        GNUTLS_EXTENSION_MAX /* not real extension - used for iterators */
 } extensions_t;
 
-#define GNUTLS_EXTENSION_MAX_VALUE 31
-#define ext_track_t uint32_t
+#define GNUTLS_EXTENSION_MAX_VALUE 63
+#define ext_track_t uint64_t
 
 #if GNUTLS_EXTENSION_MAX >= GNUTLS_EXTENSION_MAX_VALUE
 # error over limit
index 0c6c0dca01d2316fe01e46b25d0b2d6de4327b83..1df1506e0b1e680c96ebe2c8ee7d32070580a9a8 100644 (file)
@@ -520,7 +520,7 @@ int _gnutls_hello_ext_pack(gnutls_session_t session, gnutls_buffer_st *packed)
        BUFFER_APPEND_NUM(packed, 0);
 
        for (i = 0; i <= GNUTLS_EXTENSION_MAX_VALUE; i++) {
-               if (session->internals.used_exts & (1U << i)) {
+               if (session->internals.used_exts & ((ext_track_t)1 << i)) {
 
                        ext = gid_to_ext_entry(session, i);
                        if (ext == NULL)
index 38b28ae069ea1208b4860353b88f8350a02847db..a7b921875d390700a32c07181dd552d69481ccab 100644 (file)
@@ -160,7 +160,7 @@ typedef struct hello_ext_entry_st {
 inline static unsigned
 _gnutls_hello_ext_is_present(gnutls_session_t session, extensions_t id)
 {
-       if (session->internals.used_exts & (1U << id))
+       if (session->internals.used_exts & ((ext_track_t)1 << id))
                return 1;
 
        return 0;
@@ -184,7 +184,7 @@ unsigned _gnutls_hello_ext_save(gnutls_session_t session,
                        return 0;
        }
 
-       session->internals.used_exts |= (1U << id);
+       session->internals.used_exts |= ((ext_track_t)1 << id);
 
        return 1;
 }