]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
Do not include null terminator in DN string.
authorNikos Mavrogiannopoulos <nmav@gnutls.org>
Sat, 27 Apr 2013 18:29:52 +0000 (21:29 +0300)
committerNikos Mavrogiannopoulos <nmav@gnutls.org>
Sat, 27 Apr 2013 18:29:52 +0000 (21:29 +0300)
When printing an unknown DN string as hex do not include the null terminator.
Reported by Stef Walter.

lib/x509/common.c
lib/x509/common.h

index d120e3bb3a977f1a4d0f99e47854184c9aece74d..e1b205c9b1b48bf5c041692e85c54b4936f524a8 100644 (file)
 #include <common.h>
 #include <c-ctype.h>
 
+static int
+data2hex (const void * data, size_t data_size,
+          void * _out, size_t * sizeof_out);
+
 struct oid_to_string
 {
   const char *oid;
@@ -251,7 +255,7 @@ size_t size;
         return gnutls_assert_val(GNUTLS_E_MEMORY_ERROR);
 
       size = out->size;
-      ret = _gnutls_x509_data2hex (input->data, input->size, out->data, &size);
+      ret = data2hex (input->data, input->size, out->data, &size);
       if (ret < 0)
         {
           gnutls_assert();
@@ -388,7 +392,7 @@ _gnutls_x509_dn_to_string (const char *oid, void *value,
         return gnutls_assert_val(GNUTLS_E_MEMORY_ERROR);
 
       size = str->size;
-      ret = _gnutls_x509_data2hex (value, value_size, str->data, &size);
+      ret = data2hex (value, value_size, str->data, &size);
       if (ret < 0)
         {
           gnutls_assert();
@@ -422,13 +426,13 @@ _gnutls_x509_dn_to_string (const char *oid, void *value,
 /* Converts a data string to an LDAP rfc2253 hex string
  * something like '#01020304'
  */
-int
-_gnutls_x509_data2hex (const void * data, size_t data_size,
-                       void * _out, size_t * sizeof_out)
+static int
+data2hex (const void * data, size_t data_size,
+          void * _out, size_t * sizeof_out)
 {
   char *res;
   char escaped[MAX_STRING_LEN];
-  unsigned int size;
+  unsigned int size, res_size;
   char* out = _out;
 
   if (2 * data_size + 1 > MAX_STRING_LEN)
@@ -444,10 +448,11 @@ _gnutls_x509_data2hex (const void * data, size_t data_size,
       return GNUTLS_E_INTERNAL_ERROR;
     }
 
-  size = strlen (res) + 1;
+  res_size = strlen(res);
+  size = res_size + 1; /* +1 for the '#' */
   if (size + 1 > *sizeof_out)
     {
-      *sizeof_out = size;
+      *sizeof_out = size + 1;
       return GNUTLS_E_SHORT_MEMORY_BUFFER;
     }
   *sizeof_out = size;           /* -1 for the null +1 for the '#' */
@@ -455,8 +460,8 @@ _gnutls_x509_data2hex (const void * data, size_t data_size,
   if (out)
     {
       out[0] = '#';
-      out[1] = 0;
-      _gnutls_str_cat (out, *sizeof_out, res);
+      memcpy(&out[1], res, res_size);
+      out[size] = 0;
     }
 
   return 0;
index ebffe489d7782608fe1811e5ab729364054c1a45..399d679906b3903f0b8417fb80d736df21edf2d0 100644 (file)
@@ -80,9 +80,6 @@ int _gnutls_x509_dn_to_string (const char *OID, void *value,
                                   int value_size, gnutls_datum_t* out);
 const char* _gnutls_ldap_string_to_oid (const char* str, unsigned str_len);
 
-int _gnutls_x509_data2hex (const void * data, size_t data_size,
-                           void * out, size_t * sizeof_out);
-
 time_t _gnutls_x509_get_time (ASN1_TYPE c2, const char *when, int general);
 
 gnutls_x509_subject_alt_name_t _gnutls_x509_san_find_type (char *str_type);