From 9bed7ad7a65e7a6b1d879ef8f2b5bd8ef244a04d Mon Sep 17 00:00:00 2001 From: Nikos Mavrogiannopoulos Date: Mon, 4 Apr 2016 14:46:58 +0200 Subject: Simplify _asn1_append_value() and avoid memcpy's with zero length Based on patch of Pascal Cuoq --- lib/parser_aux.c | 28 +++++++++++++++++++--------- 1 file 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); } /******************************************************************/ -- cgit v1.2.1