]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
updated included libtasn1.
authorNikos Mavrogiannopoulos <nmav@gnutls.org>
Thu, 1 May 2014 21:14:16 +0000 (23:14 +0200)
committerNikos Mavrogiannopoulos <nmav@gnutls.org>
Thu, 1 May 2014 21:14:16 +0000 (23:14 +0200)
14 files changed:
lib/minitasn1/coding.c
lib/minitasn1/decoding.c
lib/minitasn1/element.c
lib/minitasn1/element.h
lib/minitasn1/errors.c
lib/minitasn1/gstr.c
lib/minitasn1/gstr.h
lib/minitasn1/int.h
lib/minitasn1/libtasn1.h
lib/minitasn1/parser_aux.c
lib/minitasn1/parser_aux.h
lib/minitasn1/structure.c
lib/minitasn1/structure.h
lib/minitasn1/version.c

index ef2f96ff3509da06d5e429221782809ee7dd640a..e4eb060bc8466b88289c441c13c4654cd8d28a71 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2002-2013 Free Software Foundation, Inc.
+ * Copyright (C) 2002-2014 Free Software Foundation, Inc.
  *
  * This file is part of LIBTASN1.
  *
@@ -30,6 +30,7 @@
 #include "parser_aux.h"
 #include <gstr.h>
 #include "element.h"
+#include "minmax.h"
 #include <structure.h>
 
 #define MAX_TAG_LEN 16
@@ -327,7 +328,8 @@ _asn1_get_utctime_der(unsigned char *der,int *der_len,unsigned char *str)
 /*            must store the length of DER.           */
 /* Return:                                            */
 /*   ASN1_MEM_ERROR when DER isn't big enough         */
-/*   ASN1_SUCCESS otherwise                           */
+/*   ASN1_SUCCESS if succesful                        */
+/*   or an error value.                               */
 /******************************************************/
 static int
 _asn1_objectid_der (unsigned char *str, unsigned char *der, int *der_len)
@@ -474,6 +476,8 @@ _asn1_complete_explicit_tag (asn1_node node, unsigned char *der,
   if (node->type & CONST_TAG)
     {
       p = node->down;
+      if (p == NULL)
+        return ASN1_DER_ERROR;
       /* When there are nested tags we must complete them reverse to
          the order they were created. This is because completing a tag
          modifies all data within it, including the incomplete tags
@@ -693,8 +697,10 @@ _asn1_insert_tag_der (asn1_node node, unsigned char *der, int *counter,
 /*   der: string with the DER coding.                 */
 /*   node: pointer to the SET element.                */
 /* Return:                                            */
+/*    ASN1_SUCCESS if successful                      */
+/*    or an error value.                              */
 /******************************************************/
-static void
+static int
 _asn1_ordering_set (unsigned char *der, int der_len, asn1_node node)
 {
   struct vet
@@ -708,27 +714,31 @@ _asn1_ordering_set (unsigned char *der, int der_len, asn1_node node)
   struct vet *first, *last, *p_vet, *p2_vet;
   asn1_node p;
   unsigned char class, *temp;
-  unsigned long tag;
+  unsigned long tag, t;
+  int err;
 
   counter = 0;
 
   if (type_field (node->type) != ASN1_ETYPE_SET)
-    return;
+    return ASN1_VALUE_NOT_VALID;
 
   p = node->down;
-  while ((type_field (p->type) == ASN1_ETYPE_TAG)
-        || (type_field (p->type) == ASN1_ETYPE_SIZE))
+  while (p && ((type_field (p->type) == ASN1_ETYPE_TAG) ||
+        (type_field (p->type) == ASN1_ETYPE_SIZE)))
     p = p->right;
 
   if ((p == NULL) || (p->right == NULL))
-    return;
+    return ASN1_SUCCESS;
 
   first = last = NULL;
   while (p)
     {
       p_vet = malloc (sizeof (struct vet));
       if (p_vet == NULL)
-       return;
+        {
+         err = ASN1_MEM_ALLOC_ERROR;
+         goto error;
+       }
 
       p_vet->next = NULL;
       p_vet->prev = last;
@@ -739,17 +749,22 @@ _asn1_ordering_set (unsigned char *der, int der_len, asn1_node node)
       last = p_vet;
 
       /* tag value calculation */
-      if (asn1_get_tag_der
-         (der + counter, der_len - counter, &class, &len2,
-          &tag) != ASN1_SUCCESS)
-       return;
-      p_vet->value = (class << 24) | tag;
+      err = asn1_get_tag_der (der + counter, der_len - counter, &class, &len2,
+                             &tag);
+      if (err != ASN1_SUCCESS)
+       goto error;
+
+      t = class << 24;
+      p_vet->value = t | tag;
       counter += len2;
 
       /* extraction and length */
       len2 = asn1_get_length_der (der + counter, der_len - counter, &len);
       if (len2 < 0)
-       return;
+       {
+         err = ASN1_DER_ERROR;
+         goto error;
+       }
       counter += len + len2;
 
       p_vet->end = counter;
@@ -769,7 +784,10 @@ _asn1_ordering_set (unsigned char *der, int der_len, asn1_node node)
              /* change position */
              temp = malloc (p_vet->end - counter);
              if (temp == NULL)
-               return;
+               {
+                 err = ASN1_MEM_ALLOC_ERROR;
+                 goto error;
+               }
 
              memcpy (temp, der + counter, p_vet->end - counter);
              memcpy (der + counter, der + p_vet->end,
@@ -797,6 +815,16 @@ _asn1_ordering_set (unsigned char *der, int der_len, asn1_node node)
       free (p_vet);
       p_vet = first;
     }
+  return ASN1_SUCCESS;
+
+error:
+  while (first != NULL)
+    {
+      p_vet = first;
+      first = first->next;
+      free(p_vet);
+    }
+  return err;
 }
 
 /******************************************************/
@@ -807,8 +835,10 @@ _asn1_ordering_set (unsigned char *der, int der_len, asn1_node node)
 /*   der: string with the DER coding.                 */
 /*   node: pointer to the SET OF element.             */
 /* Return:                                            */
+/*    ASN1_SUCCESS if successful                      */
+/*    or an error value.                              */
 /******************************************************/
-static void
+static int
 _asn1_ordering_set_of (unsigned char *der, int der_len, asn1_node node)
 {
   struct vet
@@ -821,28 +851,34 @@ _asn1_ordering_set_of (unsigned char *der, int der_len, asn1_node node)
   struct vet *first, *last, *p_vet, *p2_vet;
   asn1_node p;
   unsigned char *temp, class;
-  unsigned long k, max;
+  unsigned long k, length;
+  int err;
 
   counter = 0;
 
   if (type_field (node->type) != ASN1_ETYPE_SET_OF)
-    return;
+    return ASN1_VALUE_NOT_VALID;
 
   p = node->down;
-  while ((type_field (p->type) == ASN1_ETYPE_TAG)
-        || (type_field (p->type) == ASN1_ETYPE_SIZE))
+  while (p && ((type_field (p->type) == ASN1_ETYPE_TAG) ||
+        (type_field (p->type) == ASN1_ETYPE_SIZE)))
     p = p->right;
+  if (p == NULL)
+    return ASN1_VALUE_NOT_VALID;
   p = p->right;
 
   if ((p == NULL) || (p->right == NULL))
-    return;
+    return ASN1_SUCCESS;
 
   first = last = NULL;
   while (p)
     {
       p_vet = malloc (sizeof (struct vet));
       if (p_vet == NULL)
-       return;
+       {
+         err = ASN1_MEM_ALLOC_ERROR;
+         goto error;
+       }
 
       p_vet->next = NULL;
       p_vet->prev = last;
@@ -856,17 +892,25 @@ _asn1_ordering_set_of (unsigned char *der, int der_len, asn1_node node)
       if (der_len - counter > 0)
        {
 
-         if (asn1_get_tag_der
-             (der + counter, der_len - counter, &class, &len,
-              NULL) != ASN1_SUCCESS)
-           return;
+         err = asn1_get_tag_der (der + counter, der_len - counter, &class,
+                                 &len, NULL);
+         if (err != ASN1_SUCCESS)
+           goto error;
          counter += len;
 
          len2 = asn1_get_length_der (der + counter, der_len - counter, &len);
          if (len2 < 0)
-           return;
+           {
+             err = ASN1_DER_ERROR;
+             goto error;
+           }
          counter += len + len2;
        }
+      else
+       {
+         err = ASN1_DER_ERROR;
+         goto error;
+       }
 
       p_vet->end = counter;
       p = p->right;
@@ -880,13 +924,9 @@ _asn1_ordering_set_of (unsigned char *der, int der_len, asn1_node node)
       counter = 0;
       while (p2_vet)
        {
-         if ((p_vet->end - counter) > (p2_vet->end - p_vet->end))
-           max = p_vet->end - counter;
-         else
-           max = p2_vet->end - p_vet->end;
-
+         length = MIN(p_vet->end - counter, p2_vet->end - p_vet->end);
          change = -1;
-         for (k = 0; k < max; k++)
+         for (k = 0; k < length; k++)
            if (der[counter + k] > der[p_vet->end + k])
              {
                change = 1;
@@ -907,7 +947,10 @@ _asn1_ordering_set_of (unsigned char *der, int der_len, asn1_node node)
              /* change position */
              temp = malloc (p_vet->end - counter);
              if (temp == NULL)
-               return;
+               {
+                 err = ASN1_MEM_ALLOC_ERROR;
+                 goto error;
+               }
 
              memcpy (temp, der + counter, (p_vet->end) - counter);
              memcpy (der + counter, der + (p_vet->end),
@@ -931,6 +974,16 @@ _asn1_ordering_set_of (unsigned char *der, int der_len, asn1_node node)
       free (p_vet);
       p_vet = first;
     }
+  return ASN1_SUCCESS;
+
+error:
+  while (first != NULL)
+    {
+      p_vet = first;
+      first = first->next;
+      free(p_vet);
+    }
+  return err;
 }
 
 /**
@@ -1163,7 +1216,11 @@ asn1_der_coding (asn1_node element, const char *name, void *ider, int *len,
              len2 = _asn1_strtol (p->value, NULL, 10);
              _asn1_set_value (p, NULL, 0);
              if ((type_field (p->type) == ASN1_ETYPE_SET) && (max_len >= 0))
-               _asn1_ordering_set (der + len2, max_len - len2, p);
+               {
+                 err = _asn1_ordering_set (der + len2, counter - len2, p);
+                 if (err != ASN1_SUCCESS)
+                   goto error;
+               }
              asn1_length_der (counter - len2, temp, &len3);
              max_len -= len3;
              if (max_len >= 0)
@@ -1203,9 +1260,11 @@ asn1_der_coding (asn1_node element, const char *name, void *ider, int *len,
              len2 = _asn1_strtol (p->value, NULL, 10);
              _asn1_set_value (p, NULL, 0);
              if ((type_field (p->type) == ASN1_ETYPE_SET_OF)
-                 && (max_len - len2 > 0))
+                 && (counter - len2 > 0) && (max_len >= 0))
                {
-                 _asn1_ordering_set_of (der + len2, max_len - len2, p);
+                 err = _asn1_ordering_set_of (der + len2, counter - len2, p);
+                 if (err != ASN1_SUCCESS)
+                   goto error;
                }
              asn1_length_der (counter - len2, temp, &len3);
              max_len -= len3;
index eb83d89ca0981ac6f3ca11536f2601dac94248f9..0b334fefc4ba86f1516786ec61eaf08b132f0923 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2002-2013 Free Software Foundation, Inc.
+ * Copyright (C) 2002-2014 Free Software Foundation, Inc.
  *
  * This file is part of LIBTASN1.
  *
@@ -376,6 +376,7 @@ asn1_get_bit_der (const unsigned char *der, int der_len,
   return ASN1_SUCCESS;
 }
 
+
 static int
 _asn1_extract_tag_der (asn1_node node, const unsigned char *der, int der_len,
                       int *ret_len)
@@ -537,6 +538,9 @@ _asn1_extract_tag_der (asn1_node node, const unsigned char *der, int der_len,
        case ASN1_ETYPE_ANY:
          counter -= len2;
          break;
+       case ASN1_ETYPE_CHOICE:
+         counter -= len2;
+         break;
        default:
          return ASN1_DER_ERROR;
          break;
@@ -548,6 +552,31 @@ _asn1_extract_tag_der (asn1_node node, const unsigned char *der, int der_len,
   return ASN1_SUCCESS;
 }
 
+static int
+extract_tag_der_recursive(asn1_node node, const unsigned char *der, int der_len,
+                      int *ret_len)
+{
+asn1_node p;
+int ris = ASN1_DER_ERROR;
+
+  if (type_field (node->type) == ASN1_ETYPE_CHOICE)
+    {
+      p = node->down;
+      while (p)
+        {
+          ris = _asn1_extract_tag_der (p, der, der_len, ret_len);
+          if (ris == ASN1_SUCCESS)
+            break;
+          p = p->right;
+       }
+
+      *ret_len = 0;
+      return ris;
+    }
+  else
+    return _asn1_extract_tag_der (node, der, der_len, ret_len);
+}
+
 static int
 _asn1_delete_not_used (asn1_node node)
 {
@@ -782,6 +811,17 @@ _asn1_get_indefinite_length_string (const unsigned char *der, int *len)
 
 }
 
+static void delete_unneeded_choice_fields(asn1_node p)
+{
+  asn1_node p2;
+
+  while (p->right)
+    {
+      p2 = p->right;
+      asn1_delete_structure (&p2);
+    }
+}
+
 /**
  * asn1_der_decoding:
  * @element: pointer to an ASN1 structure.
@@ -865,23 +905,9 @@ asn1_der_decoding (asn1_node * element, const void *ider, int len,
                {
                  if ((p2->type & CONST_SET) && (p2->type & CONST_NOT_USED))
                    {
-                     if (type_field (p2->type) != ASN1_ETYPE_CHOICE)
-                       ris =
-                         _asn1_extract_tag_der (p2, der + counter,
+                     ris =
+                         extract_tag_der_recursive (p2, der + counter,
                                                 len - counter, &len2);
-                     else
-                       {
-                         p3 = p2->down;
-                         while (p3)
-                           {
-                             ris =
-                               _asn1_extract_tag_der (p3, der + counter,
-                                                      len - counter, &len2);
-                             if (ris == ASN1_SUCCESS)
-                               break;
-                             p3 = p3->right;
-                           }
-                       }
                      if (ris == ASN1_SUCCESS)
                        {
                          p2->type &= ~CONST_NOT_USED;
@@ -926,17 +952,13 @@ asn1_der_decoding (asn1_node * element, const void *ider, int len,
                {
                  if (counter < len)
                    ris =
-                     _asn1_extract_tag_der (p->down, der + counter,
+                     extract_tag_der_recursive (p->down, der + counter,
                                             len - counter, &len2);
                  else
                    ris = ASN1_DER_ERROR;
                  if (ris == ASN1_SUCCESS)
                    {
-                     while (p->down->right)
-                       {
-                         p2 = p->down->right;
-                         asn1_delete_structure (&p2);
-                       }
+                     delete_unneeded_choice_fields(p->down);
                      break;
                    }
                  else if (ris == ASN1_ERROR_TYPE_ANY)
@@ -959,7 +981,7 @@ asn1_der_decoding (asn1_node * element, const void *ider, int len,
                      goto cleanup;
                    }
                }
-             else
+             else if (type_field (p->type) != ASN1_ETYPE_CHOICE)
                p = p->down;
            }
 
@@ -973,7 +995,7 @@ asn1_der_decoding (asn1_node * element, const void *ider, int len,
 
          if (ris == ASN1_SUCCESS)
            ris =
-             _asn1_extract_tag_der (p, der + counter, len - counter, &len2);
+             extract_tag_der_recursive (p, der + counter, len - counter, &len2);
          if (ris != ASN1_SUCCESS)
            {
              if (p->type & CONST_OPTION)
@@ -1473,23 +1495,9 @@ asn1_der_decoding_element (asn1_node * structure, const char *elementName,
                {
                  if ((p2->type & CONST_SET) && (p2->type & CONST_NOT_USED))
                    {
-                     if (type_field (p2->type) != ASN1_ETYPE_CHOICE)
-                       ris =
-                         _asn1_extract_tag_der (p2, der + counter,
+                     ris =
+                         extract_tag_der_recursive (p2, der + counter,
                                                 len - counter, &len2);
-                     else
-                       {
-                         p3 = p2->down;
-                         while (p3)
-                           {
-                             ris =
-                               _asn1_extract_tag_der (p3, der + counter,
-                                                      len - counter, &len2);
-                             if (ris == ASN1_SUCCESS)
-                               break;
-                             p3 = p3->right;
-                           }
-                       }
                      if (ris == ASN1_SUCCESS)
                        {
                          p2->type &= ~CONST_NOT_USED;
@@ -1540,11 +1548,7 @@ asn1_der_decoding_element (asn1_node * structure, const char *elementName,
                    ris = ASN1_DER_ERROR;
                  if (ris == ASN1_SUCCESS)
                    {
-                     while (p->down->right)
-                       {
-                         p2 = p->down->right;
-                         asn1_delete_structure (&p2);
-                       }
+                     delete_unneeded_choice_fields(p->down);
                      break;
                    }
                  else if (ris == ASN1_ERROR_TYPE_ANY)
@@ -1567,7 +1571,7 @@ asn1_der_decoding_element (asn1_node * structure, const char *elementName,
                      goto cleanup;
                    }
                }
-             else
+             else if (type_field (p->type) != ASN1_ETYPE_CHOICE)
                p = p->down;
            }
 
@@ -2185,7 +2189,7 @@ int
 asn1_der_decoding_startEnd (asn1_node element, const void *ider, int len,
                            const char *name_element, int *start, int *end)
 {
-  asn1_node node, node_to_find, p, p2, p3;
+  asn1_node node, node_to_find, p, p2;
   int counter, len2, len3, len4, move, ris;
   unsigned char class;
   unsigned long tag;
@@ -2256,20 +2260,9 @@ asn1_der_decoding_startEnd (asn1_node element, const void *ider, int len,
                {
                  if ((p2->type & CONST_SET) && (p2->type & CONST_NOT_USED))
                    {           /* CONTROLLARE */
-                     if (type_field (p2->type) != ASN1_ETYPE_CHOICE)
-                       ris =
-                         _asn1_extract_tag_der (p2, der + counter,
+                     ris =
+                         extract_tag_der_recursive (p2, der + counter,
                                                 len - counter, &len2);
-                     else
-                       {
-                         p3 = p2->down;
-                         if (p3 == NULL)
-                           return ASN1_DER_ERROR;
-
-                         ris =
-                           _asn1_extract_tag_der (p3, der + counter,
-                                                  len - counter, &len2);
-                       }
                      if (ris == ASN1_SUCCESS)
                        {
                          p2->type &= ~CONST_NOT_USED;
@@ -2516,18 +2509,18 @@ asn1_der_decoding_startEnd (asn1_node element, const void *ider, int len,
 int
 asn1_expand_any_defined_by (asn1_node definitions, asn1_node * element)
 {
-  char definitionsName[ASN1_MAX_NAME_SIZE], name[2 * ASN1_MAX_NAME_SIZE + 1],
+  char name[2 * ASN1_MAX_NAME_SIZE + 1],
     value[ASN1_MAX_NAME_SIZE];
   int retCode = ASN1_SUCCESS, result;
   int len, len2, len3;
   asn1_node p, p2, p3, aux = NULL;
   char errorDescription[ASN1_MAX_ERROR_DESCRIPTION_SIZE];
+  const char *definitionsName;
 
   if ((definitions == NULL) || (*element == NULL))
     return ASN1_ELEMENT_NOT_FOUND;
 
-  strcpy (definitionsName, definitions->name);
-  strcat (definitionsName, ".");
+  definitionsName = definitions->name;
 
   p = *element;
   while (p)
@@ -2602,8 +2595,7 @@ asn1_expand_any_defined_by (asn1_node definitions, asn1_node * element)
                  if ((type_field (p2->type) == ASN1_ETYPE_OBJECT_ID) &&
                      (p2->type & CONST_ASSIGN))
                    {
-                     strcpy (name, definitionsName);
-                     strcat (name, p2->name);
+                     snprintf(name, sizeof(name), "%s.%s", definitionsName, p2->name);
 
                      len = ASN1_MAX_NAME_SIZE;
                      result =
@@ -2619,8 +2611,7 @@ asn1_expand_any_defined_by (asn1_node definitions, asn1_node * element)
 
                          if (p2)
                            {
-                             strcpy (name, definitionsName);
-                             strcat (name, p2->name);
+                             snprintf(name, sizeof(name), "%s.%s", definitionsName, p2->name);
 
                              result =
                                asn1_create_element (definitions, name, &aux);
index 8604c24f285f7a62caec5b5ac3fe61f871083243..1fd988a88d15698309b4d35841262b39622a9ab7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2000-2013 Free Software Foundation, Inc.
+ * Copyright (C) 2000-2014 Free Software Foundation, Inc.
  *
  * This file is part of LIBTASN1.
  *
@@ -290,7 +290,7 @@ asn1_write_value (asn1_node node_root, const char *name,
 
   type = type_field (node->type);
 
-  if ((type == ASN1_ETYPE_SEQUENCE_OF) && (value == NULL) && (len == 0))
+  if ((type == ASN1_ETYPE_SEQUENCE_OF || type == ASN1_ETYPE_SET_OF) && (value == NULL) && (len == 0))
     {
       p = node->down;
       while ((type_field (p->type) == ASN1_ETYPE_TAG)
@@ -303,6 +303,12 @@ asn1_write_value (asn1_node node_root, const char *name,
       return ASN1_SUCCESS;
     }
 
+  /* Don't allow element deletion for other types */
+  if (value == NULL)
+    {
+      return ASN1_VALUE_NOT_VALID;
+    }
+
   switch (type)
     {
     case ASN1_ETYPE_BOOLEAN:
@@ -615,16 +621,18 @@ asn1_write_value (asn1_node node_root, const char *name,
        if (ptr_size < data_size) { \
                return ASN1_MEM_ERROR; \
        } else { \
-               memcpy( ptr, data, data_size); \
+               if (ptr) \
+                 memcpy (ptr, data, data_size); \
        }
 
 #define PUT_STR_VALUE( ptr, ptr_size, data) \
-       *len = _asn1_strlen(data) + 1; \
+       *len = _asn1_strlen (data) + 1; \
        if (ptr_size < *len) { \
                return ASN1_MEM_ERROR; \
        } else { \
                /* this strcpy is checked */ \
-               _asn1_strcpy(ptr, data); \
+               if (ptr) \
+                 _asn1_strcpy (ptr, data); \
        }
 
 #define PUT_AS_STR_VALUE( ptr, ptr_size, data, data_size) \
@@ -633,17 +641,19 @@ asn1_write_value (asn1_node node_root, const char *name,
                return ASN1_MEM_ERROR; \
        } else { \
                /* this strcpy is checked */ \
-               memcpy(ptr, data, data_size); \
-               ptr[data_size] = 0; \
+               if (ptr) { \
+                 memcpy (ptr, data, data_size); \
+                 ptr[data_size] = 0; \
+               } \
        }
 
 #define ADD_STR_VALUE( ptr, ptr_size, data) \
-       *len = (int) _asn1_strlen(data) + 1; \
-       if (ptr_size < (int) _asn1_strlen(ptr)+(*len)) { \
+       *len = (int) _asn1_strlen (data) + 1; \
+       if (ptr_size < (int) _asn1_strlen (ptr) + (*len)) { \
                return ASN1_MEM_ERROR; \
        } else { \
                /* this strcat is checked */ \
-               _asn1_strcat(ptr, data); \
+               if (ptr) _asn1_strcat (ptr, data); \
        }
 
 /**
index 014b47354be2ab73a6ede797798889170c2af2f0..fdecafb611ec3b8f6d658292198a1beadee3cb71 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2000-2013 Free Software Foundation, Inc.
+ * Copyright (C) 2000-2014 Free Software Foundation, Inc.
  *
  * This file is part of LIBTASN1.
  *
index 99c09d05f472c1b0cb74cf981f33d8e50ae5ed15..e9fa302605c15e46c4c99b171e5d9d1290e4d89c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2002-2013 Free Software Foundation, Inc.
+ * Copyright (C) 2002-2014 Free Software Foundation, Inc.
  *
  * This file is part of LIBTASN1.
  *
index 34955e9a2e474ab4313f06718e56e163a840a93c..e91a3a151c0d6dbe7447748bbca8b9d6aa9914f7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2002-2013 Free Software Foundation, Inc.
+ * Copyright (C) 2002-2014 Free Software Foundation, Inc.
  *
  * This file is part of LIBTASN1.
  *
index 0eb8bb44e6c925160092603ad0e6272ebe2e3330..51db059489ccb5e31f7dab4232cb29f7f34231de 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2002-2013 Free Software Foundation, Inc.
+ * Copyright (C) 2002-2014 Free Software Foundation, Inc.
  *
  * This file is part of LIBTASN1.
  *
index 71848f9d447cf6bf8f910c4e1a8b9e1a334f44e8..3701e5f6458078d363eb1689df4225b56fcff3d7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2002-2013 Free Software Foundation, Inc.
+ * Copyright (C) 2002-2014 Free Software Foundation, Inc.
  *
  * This file is part of LIBTASN1.
  *
index f29e6a4107db4e92455a354017e822a85b9bf12d..92ae54eb4e55a1bea0e59b972dbb606948bb1988 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2002-2013 Free Software Foundation, Inc.
+ * Copyright (C) 2002-2014 Free Software Foundation, Inc.
  *
  * This file is part of LIBTASN1.
  *
@@ -44,7 +44,7 @@ extern "C"
 {
 #endif
 
-#define ASN1_VERSION "3.4"
+#define ASN1_VERSION "3.5"
 
   /*****************************************/
   /* Errors returned by libtasn1 functions */
index fccfed56ad5688217f4c063d4cbb3aa7b0b54ab4..b5f665db4c27d1d659cc5d3def7bcba91cf5a5bb 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2000-2013 Free Software Foundation, Inc.
+ * Copyright (C) 2000-2014 Free Software Foundation, Inc.
  *
  * This file is part of LIBTASN1.
  *
@@ -131,7 +131,7 @@ asn1_find_node (asn1_node pointer, const char *name)
 
       while (p)
        {
-         if ((p->name) && nhash == p->name_hash && (!strcmp (p->name, n)))
+         if (nhash == p->name_hash && (!strcmp (p->name, n)))
            break;
          else
            p = p->right;
@@ -457,7 +457,7 @@ _asn1_remove_node (asn1_node node, unsigned int flags)
 {
   if (node == NULL)
     return;
-    
+
   if (flags & ASN1_DELETE_FLAG_ZEROIZE)
     memset(node->value, 0, node->value_len);
 
@@ -909,7 +909,7 @@ _asn1_check_identifier (asn1_node node)
   p = node;
   while (p)
     {
-      if (type_field (p->type) == ASN1_ETYPE_IDENTIFIER)
+      if (p->value && type_field (p->type) == ASN1_ETYPE_IDENTIFIER)
        {
          _asn1_str_cpy (name2, sizeof (name2), node->name);
          _asn1_str_cat (name2, sizeof (name2), ".");
index 5fd4e648fde2d17311bfdb7de8f89bead5f53c1c..bf378527fe5b6f7ec80585d690a15d9a4fe0669c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2000-2013 Free Software Foundation, Inc.
+ * Copyright (C) 2000-2014 Free Software Foundation, Inc.
  *
  * This file is part of LIBTASN1.
  *
index 611ed94bfab1e3feee0816b931c18b7944f3dd99..27fbfe3a226d892df092cf5188c0d38ebcc9ec36 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2002-2013 Free Software Foundation, Inc.
+ * Copyright (C) 2002-2014 Free Software Foundation, Inc.
  *
  * This file is part of LIBTASN1.
  *
@@ -1087,18 +1087,17 @@ asn1_number_of_elements (asn1_node element, const char *name, int *num)
 const char *
 asn1_find_structure_from_oid (asn1_node definitions, const char *oidValue)
 {
-  char definitionsName[ASN1_MAX_NAME_SIZE], name[2 * ASN1_MAX_NAME_SIZE + 1];
+  char name[2 * ASN1_MAX_NAME_SIZE + 1];
   char value[ASN1_MAX_NAME_SIZE];
   asn1_node p;
   int len;
   int result;
+  const char *definitionsName;
 
   if ((definitions == NULL) || (oidValue == NULL))
     return NULL;               /* ASN1_ELEMENT_NOT_FOUND; */
 
-
-  strcpy (definitionsName, definitions->name);
-  strcat (definitionsName, ".");
+  definitionsName = definitions->name;
 
   /* search the OBJECT_ID into definitions */
   p = definitions->down;
@@ -1107,8 +1106,7 @@ asn1_find_structure_from_oid (asn1_node definitions, const char *oidValue)
       if ((type_field (p->type) == ASN1_ETYPE_OBJECT_ID) &&
          (p->type & CONST_ASSIGN))
        {
-         strcpy (name, definitionsName);
-         strcat (name, p->name);
+          snprintf(name, sizeof(name), "%s.%s", definitionsName, p->name);
 
          len = ASN1_MAX_NAME_SIZE;
          result = asn1_read_value (definitions, name, value, &len);
index 0e1e79db57b31564a8e5807b780f99950146a4d9..bb6e7a9b9a65b4c4cdf0dd476500b5e3603db0a1 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2002-2013 Free Software Foundation, Inc.
+ * Copyright (C) 2002-2014 Free Software Foundation, Inc.
  *
  * This file is part of LIBTASN1.
  *
index 372523685afcf45ffbbd4ba7741ad2f799ae9975..25f8a8f28eecf0468bc3c9d66446787260397ada 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2000-2013 Free Software Foundation, Inc.
+ * Copyright (C) 2000-2014 Free Software Foundation, Inc.
  *
  * This file is part of LIBTASN1.
  *