diff options
-rw-r--r-- | lib/ext/server_name.c | 110 | ||||
-rw-r--r-- | lib/libgnutls.map | 1 |
2 files changed, 64 insertions, 47 deletions
diff --git a/lib/ext/server_name.c b/lib/ext/server_name.c index 237eb019bd..62b1244cd5 100644 --- a/lib/ext/server_name.c +++ b/lib/ext/server_name.c @@ -42,6 +42,10 @@ static int _gnutls_server_name_pack(extension_priv_data_t _priv, gnutls_buffer_st * ps); static void _gnutls_server_name_deinit_data(extension_priv_data_t priv); +int +_gnutls_server_name_set_raw(gnutls_session_t session, + gnutls_server_name_type_t type, + const void *name, size_t name_length); const extension_entry_st ext_mod_server_name = { .name = "SERVER NAME", @@ -376,6 +380,60 @@ static int l_idna_to_ascii (const char *_name, unsigned length, char **output) } #endif +/* This does not do any conversion not perform any check */ +int +_gnutls_server_name_set_raw(gnutls_session_t session, + gnutls_server_name_type_t type, + const void *name, size_t name_length) +{ + int server_names, ret; + server_name_ext_st *priv; + extension_priv_data_t epriv; + int set = 0; + + if (name_length > MAX_SERVER_NAME_SIZE) { + return GNUTLS_E_SHORT_MEMORY_BUFFER; + } + + ret = + _gnutls_ext_get_session_data(session, + GNUTLS_EXTENSION_SERVER_NAME, + &epriv); + if (ret < 0) { + set = 1; + } + + if (set != 0) { + priv = gnutls_calloc(1, sizeof(*priv)); + if (priv == NULL) { + gnutls_assert(); + return GNUTLS_E_MEMORY_ERROR; + } + epriv = priv; + } else + priv = epriv; + + server_names = priv->server_names_size + 1; + + if (server_names > MAX_SERVER_NAME_EXTENSIONS) + server_names = MAX_SERVER_NAME_EXTENSIONS; + + priv->server_names[server_names - 1].type = type; + memcpy(priv->server_names[server_names - 1].name, name, + name_length); + priv->server_names[server_names - 1].name[name_length] = 0; + priv->server_names[server_names - 1].name_length = name_length; + + priv->server_names_size = server_names; + + if (set != 0) + _gnutls_ext_set_session_data(session, + GNUTLS_EXTENSION_SERVER_NAME, + epriv); + + return 0; +} + /** * gnutls_server_name_set: * @session: is a #gnutls_session_t type. @@ -392,7 +450,9 @@ static int l_idna_to_ascii (const char *_name, unsigned length, char **output) * %GNUTLS_NAME_DNS, a UTF-8 null-terminated domain name string, * without the trailing dot, is expected. * - * IPv4 or IPv6 addresses are not permitted. + * IPv4 or IPv6 addresses are not permitted to be set by this function. + * If the function is called with a name of @name_length zero it will clear + * all server names set. * * Returns: On success, %GNUTLS_E_SUCCESS (0) is returned, * otherwise a negative error code is returned. @@ -402,11 +462,8 @@ gnutls_server_name_set(gnutls_session_t session, gnutls_server_name_type_t type, const void *name, size_t name_length) { - int server_names, ret; - server_name_ext_st *priv; - extension_priv_data_t epriv; + int ret, rc; char *idn_name = NULL; - int set = 0, rc; if (session->security_parameters.entity == GNUTLS_SERVER) { gnutls_assert(); @@ -428,48 +485,7 @@ gnutls_server_name_set(gnutls_session_t session, name_length = strlen(idn_name); #endif - if (name_length > MAX_SERVER_NAME_SIZE) { - ret = GNUTLS_E_SHORT_MEMORY_BUFFER; - goto cleanup; - } - - ret = - _gnutls_ext_get_session_data(session, - GNUTLS_EXTENSION_SERVER_NAME, - &epriv); - if (ret < 0) { - set = 1; - } - - if (set != 0) { - priv = gnutls_calloc(1, sizeof(*priv)); - if (priv == NULL) { - gnutls_assert(); - return GNUTLS_E_MEMORY_ERROR; - } - epriv = priv; - } else - priv = epriv; - - server_names = priv->server_names_size + 1; - - if (server_names > MAX_SERVER_NAME_EXTENSIONS) - server_names = MAX_SERVER_NAME_EXTENSIONS; - - priv->server_names[server_names - 1].type = type; - memcpy(priv->server_names[server_names - 1].name, name, - name_length); - priv->server_names[server_names - 1].name_length = name_length; - - priv->server_names_size = server_names; - - if (set != 0) - _gnutls_ext_set_session_data(session, - GNUTLS_EXTENSION_SERVER_NAME, - epriv); - - ret = 0; - cleanup: + ret = _gnutls_server_name_set_raw(session, type, name, name_length); #ifdef HAVE_LIBIDN idn_free(idn_name); #endif diff --git a/lib/libgnutls.map b/lib/libgnutls.map index 8340933e97..8e63e5d674 100644 --- a/lib/libgnutls.map +++ b/lib/libgnutls.map @@ -1144,4 +1144,5 @@ GNUTLS_PRIVATE_3_4 { _gnutls_resolve_priorities; # Internal symbols needed by tests/name-constraints-merge: _gnutls_x509_name_constraints_merge; + _gnutls_server_name_set_raw; }; |