diff options
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/libcrypto/pem/pem_info.c | 38 |
1 files changed, 17 insertions, 21 deletions
diff --git a/src/lib/libcrypto/pem/pem_info.c b/src/lib/libcrypto/pem/pem_info.c index f02aaa8bb4..9561b5f4df 100644 --- a/src/lib/libcrypto/pem/pem_info.c +++ b/src/lib/libcrypto/pem/pem_info.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: pem_info.c,v 1.22 2017/01/29 17:49:23 beck Exp $ */ | 1 | /* $OpenBSD: pem_info.c,v 1.23 2020/07/23 17:15:35 schwarze 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 | * |
@@ -101,29 +101,28 @@ PEM_X509_INFO_read_bio(BIO *bp, STACK_OF(X509_INFO) *sk, pem_password_cb *cb, | |||
101 | void *pp; | 101 | void *pp; |
102 | unsigned char *data = NULL; | 102 | unsigned char *data = NULL; |
103 | const unsigned char *p; | 103 | const unsigned char *p; |
104 | long len, error = 0; | 104 | long len; |
105 | int ok = 0; | 105 | int ok = 0; |
106 | STACK_OF(X509_INFO) *ret = NULL; | 106 | int num_in, ptype, raw; |
107 | unsigned int i, raw, ptype; | 107 | STACK_OF(X509_INFO) *ret = sk; |
108 | d2i_of_void *d2i = 0; | 108 | d2i_of_void *d2i = NULL; |
109 | 109 | ||
110 | if (sk == NULL) { | 110 | if (ret == NULL) { |
111 | if ((ret = sk_X509_INFO_new_null()) == NULL) { | 111 | if ((ret = sk_X509_INFO_new_null()) == NULL) { |
112 | PEMerror(ERR_R_MALLOC_FAILURE); | 112 | PEMerror(ERR_R_MALLOC_FAILURE); |
113 | return 0; | 113 | return NULL; |
114 | } | 114 | } |
115 | } else | 115 | } |
116 | ret = sk; | 116 | num_in = sk_X509_INFO_num(ret); |
117 | 117 | ||
118 | if ((xi = X509_INFO_new()) == NULL) | 118 | if ((xi = X509_INFO_new()) == NULL) |
119 | goto err; | 119 | goto err; |
120 | for (;;) { | 120 | for (;;) { |
121 | raw = 0; | 121 | raw = 0; |
122 | ptype = 0; | 122 | ptype = 0; |
123 | i = PEM_read_bio(bp, &name, &header, &data, &len); | 123 | if (!PEM_read_bio(bp, &name, &header, &data, &len)) { |
124 | if (i == 0) { | 124 | if (ERR_GET_REASON(ERR_peek_last_error()) == |
125 | error = ERR_GET_REASON(ERR_peek_last_error()); | 125 | PEM_R_NO_START_LINE) { |
126 | if (error == PEM_R_NO_START_LINE) { | ||
127 | ERR_clear_error(); | 126 | ERR_clear_error(); |
128 | break; | 127 | break; |
129 | } | 128 | } |
@@ -286,22 +285,19 @@ start: | |||
286 | ok = 1; | 285 | ok = 1; |
287 | 286 | ||
288 | err: | 287 | err: |
289 | if (xi != NULL) | ||
290 | X509_INFO_free(xi); | ||
291 | if (!ok) { | 288 | if (!ok) { |
292 | for (i = 0; ((int)i) < sk_X509_INFO_num(ret); i++) { | 289 | while (sk_X509_INFO_num(ret) > num_in) |
293 | xi = sk_X509_INFO_value(ret, i); | 290 | X509_INFO_free(sk_X509_INFO_pop(ret)); |
294 | X509_INFO_free(xi); | ||
295 | } | ||
296 | if (ret != sk) | 291 | if (ret != sk) |
297 | sk_X509_INFO_free(ret); | 292 | sk_X509_INFO_free(ret); |
298 | ret = NULL; | 293 | ret = NULL; |
299 | } | 294 | } |
300 | 295 | X509_INFO_free(xi); | |
301 | free(name); | 296 | free(name); |
302 | free(header); | 297 | free(header); |
303 | free(data); | 298 | free(data); |
304 | return (ret); | 299 | |
300 | return ret; | ||
305 | } | 301 | } |
306 | 302 | ||
307 | 303 | ||