asn1_item_embed_new(): if locking failed, don't call asn1_item_embed_free()
authorRichard Levitte <levitte@openssl.org>
Tue, 24 Oct 2017 16:32:22 +0000 (18:32 +0200)
committerRichard Levitte <levitte@openssl.org>
Tue, 24 Oct 2017 18:52:12 +0000 (20:52 +0200)
asn1_item_embed_free() will try unlocking and fail in this case, and
since the new item was just allocated on the heap, free it directly
with OPENSSL_free() instead.

Reviewed-by: Rich Salz <rsalz@openssl.org>
Reviewed-by: Bernd Edlinger <bernd.edlinger@hotmail.de>
(Merged from https://github.com/openssl/openssl/pull/4579)

crypto/asn1/tasn_new.c

index 63a4b38ee99c0df8cd0c63c189e553b2a61f5c9f..11c804026adc0b434e9b6e588e35aa2496312e77 100644 (file)
@@ -124,8 +124,13 @@ int asn1_item_embed_new(ASN1_VALUE **pval, const ASN1_ITEM *it, int embed)
                 goto memerr;
         }
         /* 0 : init. lock */
-        if (asn1_do_lock(pval, 0, it) < 0)
-            goto memerr2;
+        if (asn1_do_lock(pval, 0, it) < 0) {
+            if (!embed) {
+                OPENSSL_free(*pval);
+                *pval = NULL;
+            }
+            goto memerr;
+        }
         asn1_enc_init(pval, it);
         for (i = 0, tt = it->templates; i < it->tcount; tt++, i++) {
             pseqval = asn1_get_field_ptr(pval, tt);