summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@redhat.com>2016-05-12 11:22:51 +0200
committerNikos Mavrogiannopoulos <nmav@redhat.com>2016-05-12 11:22:53 +0200
commit31bb3f8826bf8abf712d43b702204836e3a6d8f4 (patch)
treeccf994966b6fe0361f70bb75e869d4555b25a226
parent7fd1dc772775c1b98ba181c3c75350b43c995d01 (diff)
downloadgnutls-31bb3f8826bf8abf712d43b702204836e3a6d8f4.tar.gz
Introduce _gnutls_server_name_set_raw
This is an internal function intended for testing, which performs the same as gnutls_server_name_set() but without any UTF8 conversions or other checks in the input. It is intended to be used with raw data.
-rw-r--r--lib/ext/server_name.c110
-rw-r--r--lib/libgnutls.map1
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;
};