From: Nikos Mavrogiannopoulos Date: Thu, 1 May 2014 21:14:16 +0000 (+0200) Subject: updated included libtasn1. X-Git-Tag: gnutls_3_3_2~32 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=095136286a76cdf4f74e31225ace0e4eec41c3cf;p=thirdparty%2Fgnutls.git updated included libtasn1. --- diff --git a/lib/minitasn1/coding.c b/lib/minitasn1/coding.c index ef2f96ff35..e4eb060bc8 100644 --- a/lib/minitasn1/coding.c +++ b/lib/minitasn1/coding.c @@ -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 #include "element.h" +#include "minmax.h" #include #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; diff --git a/lib/minitasn1/decoding.c b/lib/minitasn1/decoding.c index eb83d89ca0..0b334fefc4 100644 --- a/lib/minitasn1/decoding.c +++ b/lib/minitasn1/decoding.c @@ -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); diff --git a/lib/minitasn1/element.c b/lib/minitasn1/element.c index 8604c24f28..1fd988a88d 100644 --- a/lib/minitasn1/element.c +++ b/lib/minitasn1/element.c @@ -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); \ } /** diff --git a/lib/minitasn1/element.h b/lib/minitasn1/element.h index 014b47354b..fdecafb611 100644 --- a/lib/minitasn1/element.h +++ b/lib/minitasn1/element.h @@ -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. * diff --git a/lib/minitasn1/errors.c b/lib/minitasn1/errors.c index 99c09d05f4..e9fa302605 100644 --- a/lib/minitasn1/errors.c +++ b/lib/minitasn1/errors.c @@ -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. * diff --git a/lib/minitasn1/gstr.c b/lib/minitasn1/gstr.c index 34955e9a2e..e91a3a151c 100644 --- a/lib/minitasn1/gstr.c +++ b/lib/minitasn1/gstr.c @@ -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. * diff --git a/lib/minitasn1/gstr.h b/lib/minitasn1/gstr.h index 0eb8bb44e6..51db059489 100644 --- a/lib/minitasn1/gstr.h +++ b/lib/minitasn1/gstr.h @@ -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. * diff --git a/lib/minitasn1/int.h b/lib/minitasn1/int.h index 71848f9d44..3701e5f645 100644 --- a/lib/minitasn1/int.h +++ b/lib/minitasn1/int.h @@ -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. * diff --git a/lib/minitasn1/libtasn1.h b/lib/minitasn1/libtasn1.h index f29e6a4107..92ae54eb4e 100644 --- a/lib/minitasn1/libtasn1.h +++ b/lib/minitasn1/libtasn1.h @@ -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 */ diff --git a/lib/minitasn1/parser_aux.c b/lib/minitasn1/parser_aux.c index fccfed56ad..b5f665db4c 100644 --- a/lib/minitasn1/parser_aux.c +++ b/lib/minitasn1/parser_aux.c @@ -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), "."); diff --git a/lib/minitasn1/parser_aux.h b/lib/minitasn1/parser_aux.h index 5fd4e648fd..bf378527fe 100644 --- a/lib/minitasn1/parser_aux.h +++ b/lib/minitasn1/parser_aux.h @@ -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. * diff --git a/lib/minitasn1/structure.c b/lib/minitasn1/structure.c index 611ed94bfa..27fbfe3a22 100644 --- a/lib/minitasn1/structure.c +++ b/lib/minitasn1/structure.c @@ -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); diff --git a/lib/minitasn1/structure.h b/lib/minitasn1/structure.h index 0e1e79db57..bb6e7a9b9a 100644 --- a/lib/minitasn1/structure.h +++ b/lib/minitasn1/structure.h @@ -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. * diff --git a/lib/minitasn1/version.c b/lib/minitasn1/version.c index 372523685a..25f8a8f28e 100644 --- a/lib/minitasn1/version.c +++ b/lib/minitasn1/version.c @@ -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. *