diff options
| author | tb <> | 2026-09-02 07:03:45 +0000 |
|---|---|---|
| committer | tb <> | 2026-09-02 07:03:45 +0000 |
| commit | b461e281f39ad206a28fb0dc69cfbbbd67c6303c (patch) | |
| tree | 2a4a75be81bef999bdca707f7e7b3b0e77d4c857 | |
| parent | 08df5d1bf00257e8cf066d2045cf24ecf2744efb (diff) | |
| download | openbsd-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
| -rw-r--r-- | src/lib/libcrypto/asn1/asn1_gen.c | 14 |
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) | |||
| 436 | static ASN1_TYPE * | 436 | static ASN1_TYPE * |
| 437 | asn1_multi(int utype, const char *section, X509V3_CTX *cnf) | 437 | asn1_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 | } |
