summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@redhat.com>2016-04-04 14:46:58 +0200
committerNikos Mavrogiannopoulos <nmav@redhat.com>2016-04-04 14:46:58 +0200
commit9bed7ad7a65e7a6b1d879ef8f2b5bd8ef244a04d (patch)
tree537be787a4c99dfd5dcffe98a8fd90cb816ec36e
parent0301945a0f1e33ff9e02175c7848fc7c0a91b6db (diff)
downloadlibtasn1-9bed7ad7a65e7a6b1d879ef8f2b5bd8ef244a04d.tar.gz
Simplify _asn1_append_value() and avoid memcpy's with zero length
Based on patch of Pascal Cuoq <pascal.cuoq@trust-in-soft.com>
-rw-r--r--lib/parser_aux.c28
1 files changed, 19 insertions, 9 deletions
diff --git a/lib/parser_aux.c b/lib/parser_aux.c
index 0a1f645..a42cdd2 100644
--- a/lib/parser_aux.c
+++ b/lib/parser_aux.c
@@ -316,39 +316,49 @@ _asn1_append_value (asn1_node node, const void *value, unsigned int len)
{
if (node == NULL)
return node;
- if (node->value != NULL && node->value != node->small_value)
+
+ if (node->value == NULL)
+ return _asn1_set_value (node, value, len);
+
+ if (len == 0)
+ return node;
+
+ if (node->value == node->small_value)
{
- /* value is allocated */
+ /* value is in node */
int prev_len = node->value_len;
node->value_len += len;
- node->value = _asn1_realloc (node->value, node->value_len);
+ node->value = malloc (node->value_len);
if (node->value == NULL)
{
node->value_len = 0;
return NULL;
}
+
+ if (prev_len > 0)
+ memcpy (node->value, node->small_value, prev_len);
+
memcpy (&node->value[prev_len], value, len);
return node;
}
- else if (node->value == node->small_value)
+ else /* if (node->value != NULL && node->value != node->small_value) */
{
- /* value is in node */
+ /* value is allocated */
int prev_len = node->value_len;
node->value_len += len;
- node->value = malloc (node->value_len);
+
+ node->value = _asn1_realloc (node->value, node->value_len);
if (node->value == NULL)
{
node->value_len = 0;
return NULL;
}
- memcpy (node->value, node->small_value, prev_len);
+
memcpy (&node->value[prev_len], value, len);
return node;
}
- else /* node->value == NULL */
- return _asn1_set_value (node, value, len);
}
/******************************************************************/