diff options
author | Nikos Mavrogiannopoulos <nmav@redhat.com> | 2016-04-04 14:46:58 +0200 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@redhat.com> | 2016-04-04 14:46:58 +0200 |
commit | 9bed7ad7a65e7a6b1d879ef8f2b5bd8ef244a04d (patch) | |
tree | 537be787a4c99dfd5dcffe98a8fd90cb816ec36e | |
parent | 0301945a0f1e33ff9e02175c7848fc7c0a91b6db (diff) | |
download | libtasn1-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.c | 28 |
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); } /******************************************************************/ |