diff options
author | tb <> | 2019-04-13 18:04:05 +0000 |
---|---|---|
committer | tb <> | 2019-04-13 18:04:05 +0000 |
commit | 3d8cce08c8bebf3054e601a8c3dc21b4bd8fd790 (patch) | |
tree | d8f2d01f1dd24a36cfcc1a7d87d74cd8dba8d2b4 /src | |
parent | 0eabad513bdb13f3dc8134e8f7b37906897211df (diff) | |
download | openbsd-3d8cce08c8bebf3054e601a8c3dc21b4bd8fd790.tar.gz openbsd-3d8cce08c8bebf3054e601a8c3dc21b4bd8fd790.tar.bz2 openbsd-3d8cce08c8bebf3054e601a8c3dc21b4bd8fd790.zip |
Avoid leak in SSL_dup_CA_list()
In the case that X509_NAME_dup() succeeds, but sk_X509_NAME_push()
fails, name is leaked. The entire function is trying to be clever
and therefore hard to follow. Let's do it the stupid but safe way.
ok jsing
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/libssl/ssl_cert.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/src/lib/libssl/ssl_cert.c b/src/lib/libssl/ssl_cert.c index 6c00b0d336..4641ac92d0 100644 --- a/src/lib/libssl/ssl_cert.c +++ b/src/lib/libssl/ssl_cert.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ssl_cert.c,v 1.74 2019/03/25 17:33:26 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_cert.c,v 1.75 2019/04/13 18:04:05 tb Exp $ */ |
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -466,17 +466,23 @@ SSL_dup_CA_list(const STACK_OF(X509_NAME) *sk) | |||
466 | { | 466 | { |
467 | int i; | 467 | int i; |
468 | STACK_OF(X509_NAME) *ret; | 468 | STACK_OF(X509_NAME) *ret; |
469 | X509_NAME *name; | 469 | X509_NAME *name = NULL; |
470 | |||
471 | if ((ret = sk_X509_NAME_new_null()) == NULL) | ||
472 | goto err; | ||
470 | 473 | ||
471 | ret = sk_X509_NAME_new_null(); | ||
472 | for (i = 0; i < sk_X509_NAME_num(sk); i++) { | 474 | for (i = 0; i < sk_X509_NAME_num(sk); i++) { |
473 | name = X509_NAME_dup(sk_X509_NAME_value(sk, i)); | 475 | if ((name = X509_NAME_dup(sk_X509_NAME_value(sk, i))) == NULL) |
474 | if ((name == NULL) || !sk_X509_NAME_push(ret, name)) { | 476 | goto err; |
475 | sk_X509_NAME_pop_free(ret, X509_NAME_free); | 477 | if (!sk_X509_NAME_push(ret, name)) |
476 | return (NULL); | 478 | goto err; |
477 | } | ||
478 | } | 479 | } |
479 | return (ret); | 480 | return (ret); |
481 | |||
482 | err: | ||
483 | X509_NAME_free(name); | ||
484 | sk_X509_NAME_pop_free(ret, X509_NAME_free); | ||
485 | return NULL; | ||
480 | } | 486 | } |
481 | 487 | ||
482 | void | 488 | void |