]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
handshake: simplified version parsing
authorNikos Mavrogiannopoulos <nmav@redhat.com>
Fri, 29 Sep 2017 07:01:41 +0000 (09:01 +0200)
committerNikos Mavrogiannopoulos <nmav@redhat.com>
Mon, 19 Feb 2018 14:29:35 +0000 (15:29 +0100)
Signed-off-by: Nikos Mavrogiannopoulos <nmav@redhat.com>
lib/algorithms.h
lib/algorithms/protocols.c
lib/handshake.c

index 3ff73a99edd3d70389bb87c56b847a719f8296f4..e96689208cde8d4e26174e4c05cda91027d12939 100644 (file)
@@ -45,6 +45,7 @@
 
 /* Functions for version handling. */
 const version_entry_st *version_to_entry(gnutls_protocol_t version);
+const version_entry_st *nversion_to_entry(uint8_t major, uint8_t minor);
 const version_entry_st *_gnutls_version_lowest(gnutls_session_t session);
 
 const version_entry_st *_gnutls_legacy_version_max(gnutls_session_t session);
index 36e17177030adaf87c1d5c08f6b3917a592bbf6b..be0224653716d9ca0c12b51cfde5ef0f699ab741 100644 (file)
@@ -193,6 +193,17 @@ const version_entry_st *version_to_entry(gnutls_protocol_t version)
        return NULL;
 }
 
+const version_entry_st *nversion_to_entry(uint8_t major, uint8_t minor)
+{
+       const version_entry_st *p;
+
+       for (p = sup_versions; p->name != NULL; p++) {
+               if ((p->major == major) && (p->minor == minor))
+                           return p;
+       }
+       return NULL;
+}
+
 static int
 version_is_valid_for_session(gnutls_session_t session,
                             const version_entry_st *v)
index bf2b029db3f167481cdf6f883c7fab956e8aa025..2a041ec611a477e18d059d9daad18316cbf50fa7 100644 (file)
@@ -1566,7 +1566,6 @@ read_server_hello(gnutls_session_t session,
        uint8_t session_id_len = 0;
        int pos = 0;
        int ret = 0;
-       gnutls_protocol_t version;
        int len = datalen;
        const version_entry_st *vers;
        gnutls_ext_flags_t ext_parse_flag;
@@ -1580,21 +1579,22 @@ read_server_hello(gnutls_session_t session,
                              session, data[pos], data[pos + 1]);
 
        DECR_LEN(len, 2);
-       version = _gnutls_version_get(data[pos], data[pos + 1]);
-       if (_gnutls_version_is_supported(session, version) == 0) {
+       vers = nversion_to_entry(data[pos], data[pos + 1]);
+       if (unlikely(vers == NULL))
+               return gnutls_assert_val(GNUTLS_E_UNSUPPORTED_VERSION_PACKET);
+
+       if (_gnutls_version_is_supported(session, vers->id) == 0) {
                gnutls_assert();
                return GNUTLS_E_UNSUPPORTED_VERSION_PACKET;
        }
 
-       if (_gnutls_set_current_version(session, version) < 0)
+       if (_gnutls_set_current_version(session, vers->id) < 0)
                return gnutls_assert_val(GNUTLS_E_UNSUPPORTED_VERSION_PACKET);
 
-       vers = get_version(session);
-
        pos += 2;
 
        DECR_LEN(len, GNUTLS_RANDOM_SIZE);
-       ret = _gnutls_set_server_random(session, version, &data[pos]);
+       ret = _gnutls_set_server_random(session, vers->id, &data[pos]);
        if (ret < 0)
                return gnutls_assert_val(ret);