summaryrefslogtreecommitdiff
path: root/lib/minitasn1/parser_aux.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/minitasn1/parser_aux.c')
-rw-r--r--lib/minitasn1/parser_aux.c55
1 files changed, 36 insertions, 19 deletions
diff --git a/lib/minitasn1/parser_aux.c b/lib/minitasn1/parser_aux.c
index 2285b20f58..786ea640a4 100644
--- a/lib/minitasn1/parser_aux.c
+++ b/lib/minitasn1/parser_aux.c
@@ -84,7 +84,7 @@ _asn1_add_static_node (unsigned int type)
* @name: null terminated string with the element's name to find.
*
* Searches for an element called @name starting from @pointer. The
- * name is composed by differents identifiers separated by dots. When
+ * name is composed by different identifiers separated by dots. When
* *@pointer has a name, the first identifier must be the name of
* *@pointer, otherwise it must be the name of one child of *@pointer.
*
@@ -120,6 +120,9 @@ asn1_find_node (asn1_node pointer, const char *name)
if (n_end)
{
nsize = n_end - n_start;
+ if (nsize >= sizeof(n))
+ return NULL;
+
memcpy (n, n_start, nsize);
n[nsize] = 0;
n_start = n_end;
@@ -158,6 +161,9 @@ asn1_find_node (asn1_node pointer, const char *name)
if (n_end)
{
nsize = n_end - n_start;
+ if (nsize >= sizeof(n))
+ return NULL;
+
memcpy (n, n_start, nsize);
n[nsize] = 0;
n_start = n_end;
@@ -551,29 +557,33 @@ _asn1_delete_list_and_nodes (void)
char *
_asn1_ltostr (int64_t v, char str[LTOSTR_MAX_SIZE])
{
- int64_t d, r;
+ uint64_t d, r;
char temp[LTOSTR_MAX_SIZE];
int count, k, start;
+ uint64_t val;
if (v < 0)
{
str[0] = '-';
start = 1;
- v = -v;
+ val = -((uint64_t)v);
}
else
- start = 0;
+ {
+ val = v;
+ start = 0;
+ }
count = 0;
do
{
- d = v / 10;
- r = v - d * 10;
+ d = val / 10;
+ r = val - d * 10;
temp[start + count] = '0' + (char) r;
count++;
- v = d;
+ val = d;
}
- while (v && ((start+count) < LTOSTR_MAX_SIZE-1));
+ while (val && ((start+count) < LTOSTR_MAX_SIZE-1));
for (k = 0; k < count; k++)
str[k + start] = temp[start + count - k - 1];
@@ -637,7 +647,7 @@ _asn1_change_integer_value (asn1_node node)
p = NULL;
break;
}
- if (p->right)
+ if (p && p->right)
{
p = p->right;
break;
@@ -753,7 +763,7 @@ _asn1_expand_object_id (asn1_node node)
if (move == RIGHT)
{
- if (p->right)
+ if (p && p->right)
p = p->right;
else
move = UP;
@@ -828,7 +838,7 @@ _asn1_expand_object_id (asn1_node node)
if (move == RIGHT)
{
- if (p->right)
+ if (p && p->right)
p = p->right;
else
move = UP;
@@ -898,7 +908,7 @@ _asn1_type_set_config (asn1_node node)
if (move == RIGHT)
{
- if (p->right)
+ if (p && p->right)
p = p->right;
else
move = UP;
@@ -945,7 +955,7 @@ _asn1_check_identifier (asn1_node node)
if (p2 == NULL)
{
if (p->value)
- _asn1_strcpy (_asn1_identifierMissing, p->value);
+ _asn1_str_cpy (_asn1_identifierMissing, sizeof(_asn1_identifierMissing), (char*)p->value);
else
_asn1_strcpy (_asn1_identifierMissing, "(null)");
return ASN1_IDENTIFIER_NOT_FOUND;
@@ -958,9 +968,15 @@ _asn1_check_identifier (asn1_node node)
if (p2 && (type_field (p2->type) == ASN1_ETYPE_DEFAULT))
{
_asn1_str_cpy (name2, sizeof (name2), node->name);
- _asn1_str_cat (name2, sizeof (name2), ".");
- _asn1_str_cat (name2, sizeof (name2), (char *) p2->value);
- _asn1_strcpy (_asn1_identifierMissing, p2->value);
+ if (p2->value)
+ {
+ _asn1_str_cat (name2, sizeof (name2), ".");
+ _asn1_str_cat (name2, sizeof (name2), (char *) p2->value);
+ _asn1_str_cpy (_asn1_identifierMissing, sizeof(_asn1_identifierMissing), (char*)p2->value);
+ }
+ else
+ _asn1_strcpy (_asn1_identifierMissing, "(null)");
+
p2 = asn1_find_node (node, name2);
if (!p2 || (type_field (p2->type) != ASN1_ETYPE_OBJECT_ID) ||
!(p2->type & CONST_ASSIGN))
@@ -980,7 +996,8 @@ _asn1_check_identifier (asn1_node node)
_asn1_str_cpy (name2, sizeof (name2), node->name);
_asn1_str_cat (name2, sizeof (name2), ".");
_asn1_str_cat (name2, sizeof (name2), (char *) p2->value);
- _asn1_strcpy (_asn1_identifierMissing, p2->value);
+ _asn1_str_cpy (_asn1_identifierMissing, sizeof(_asn1_identifierMissing), (char*)p2->value);
+
p2 = asn1_find_node (node, name2);
if (!p2 || (type_field (p2->type) != ASN1_ETYPE_OBJECT_ID)
|| !(p2->type & CONST_ASSIGN))
@@ -1007,7 +1024,7 @@ _asn1_check_identifier (asn1_node node)
p = NULL;
break;
}
- if (p->right)
+ if (p && p->right)
{
p = p->right;
break;
@@ -1067,7 +1084,7 @@ _asn1_set_default_tag (asn1_node node)
p = NULL;
break;
}
- if (p->right)
+ if (p && p->right)
{
p = p->right;
break;