summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authortb <>2026-09-02 07:03:45 +0000
committertb <>2026-09-02 07:03:45 +0000
commitb461e281f39ad206a28fb0dc69cfbbbd67c6303c (patch)
tree2a4a75be81bef999bdca707f7e7b3b0e77d4c857 /src/lib
parent08df5d1bf00257e8cf066d2045cf24ecf2744efb (diff)
downloadopenbsd-b461e281f39ad206a28fb0dc69cfbbbd67c6303c.tar.gz
openbsd-b461e281f39ad206a28fb0dc69cfbbbd67c6303c.tar.bz2
openbsd-b461e281f39ad206a28fb0dc69cfbbbd67c6303c.zip
asn1_multi: plug leak if sk_ASN1_TYPE_push() fails
If the push of typ onto sk fails, the exit path does not free it. Fix that and avoid function nesting when calling ASN1_generate_v3(). Prompted by a similar fix in OpenSSL ok kenjiro
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libcrypto/asn1/asn1_gen.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/src/lib/libcrypto/asn1/asn1_gen.c b/src/lib/libcrypto/asn1/asn1_gen.c
index b409e83c7d..5ff177e9d5 100644
--- a/src/lib/libcrypto/asn1/asn1_gen.c
+++ b/src/lib/libcrypto/asn1/asn1_gen.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: asn1_gen.c,v 1.28 2025/05/10 05:54:38 tb Exp $ */ 1/* $OpenBSD: asn1_gen.c,v 1.29 2026/09/02 07:03:45 tb Exp $ */
2/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL 2/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
3 * project 2002. 3 * project 2002.
4 */ 4 */
@@ -436,7 +436,7 @@ parse_tagging(const char *vstart, int vlen, int *ptag, int *pclass)
436static ASN1_TYPE * 436static ASN1_TYPE *
437asn1_multi(int utype, const char *section, X509V3_CTX *cnf) 437asn1_multi(int utype, const char *section, X509V3_CTX *cnf)
438{ 438{
439 ASN1_TYPE *ret = NULL; 439 ASN1_TYPE *ret = NULL, *typ = NULL;
440 STACK_OF(ASN1_TYPE) *sk = NULL; 440 STACK_OF(ASN1_TYPE) *sk = NULL;
441 STACK_OF(CONF_VALUE) *sect = NULL; 441 STACK_OF(CONF_VALUE) *sect = NULL;
442 unsigned char *der = NULL; 442 unsigned char *der = NULL;
@@ -452,12 +452,13 @@ asn1_multi(int utype, const char *section, X509V3_CTX *cnf)
452 if (!sect) 452 if (!sect)
453 goto bad; 453 goto bad;
454 for (i = 0; i < sk_CONF_VALUE_num(sect); i++) { 454 for (i = 0; i < sk_CONF_VALUE_num(sect); i++) {
455 ASN1_TYPE *typ = ASN1_generate_v3( 455 CONF_VALUE *val = sk_CONF_VALUE_value(sect, i);
456 sk_CONF_VALUE_value(sect, i)->value, cnf); 456
457 if (!typ) 457 if ((typ = ASN1_generate_v3(val->value, cnf)) == NULL)
458 goto bad; 458 goto bad;
459 if (!sk_ASN1_TYPE_push(sk, typ)) 459 if (sk_ASN1_TYPE_push(sk, typ) <= 0)
460 goto bad; 460 goto bad;
461 typ = NULL;
461 } 462 }
462 } 463 }
463 464
@@ -487,6 +488,7 @@ asn1_multi(int utype, const char *section, X509V3_CTX *cnf)
487 bad: 488 bad:
488 free(der); 489 free(der);
489 sk_ASN1_TYPE_pop_free(sk, ASN1_TYPE_free); 490 sk_ASN1_TYPE_pop_free(sk, ASN1_TYPE_free);
491 ASN1_TYPE_free(typ);
490 492
491 return ret; 493 return ret;
492} 494}