summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorinoguchi <>2020-01-09 11:27:21 +0000
committerinoguchi <>2020-01-09 11:27:21 +0000
commitf86f8c9701dd2cb52bed7ce290e7431d15fcd27d (patch)
tree60b7a641a247dcbbc01cbd3770047efe726ff7eb
parent1141f885583b175ef90db0a4a8118118946b803b (diff)
downloadopenbsd-f86f8c9701dd2cb52bed7ce290e7431d15fcd27d.tar.gz
openbsd-f86f8c9701dd2cb52bed7ce290e7431d15fcd27d.tar.bz2
openbsd-f86f8c9701dd2cb52bed7ce290e7431d15fcd27d.zip
Avoid leak in error path of asn1_parse2
ok tb@
-rw-r--r--src/lib/libcrypto/asn1/asn1_par.c38
1 files changed, 21 insertions, 17 deletions
diff --git a/src/lib/libcrypto/asn1/asn1_par.c b/src/lib/libcrypto/asn1/asn1_par.c
index 21f92d298d..1ec9b1ac6b 100644
--- a/src/lib/libcrypto/asn1/asn1_par.c
+++ b/src/lib/libcrypto/asn1/asn1_par.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: asn1_par.c,v 1.27 2019/03/24 16:07:25 beck Exp $ */ 1/* $OpenBSD: asn1_par.c,v 1.28 2020/01/09 11:27:21 inoguchi 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 *
@@ -123,6 +123,8 @@ asn1_parse2(BIO *bp, const unsigned char **pp, long length, int offset,
123 int nl, hl, j, r; 123 int nl, hl, j, r;
124 ASN1_OBJECT *o = NULL; 124 ASN1_OBJECT *o = NULL;
125 ASN1_OCTET_STRING *os = NULL; 125 ASN1_OCTET_STRING *os = NULL;
126 ASN1_INTEGER *ai = NULL;
127 ASN1_ENUMERATED *ae = NULL;
126 /* ASN1_BMPSTRING *bmp=NULL;*/ 128 /* ASN1_BMPSTRING *bmp=NULL;*/
127 int dump_indent; 129 int dump_indent;
128 130
@@ -296,23 +298,22 @@ asn1_parse2(BIO *bp, const unsigned char **pp, long length, int offset,
296 ASN1_OCTET_STRING_free(os); 298 ASN1_OCTET_STRING_free(os);
297 os = NULL; 299 os = NULL;
298 } else if (tag == V_ASN1_INTEGER) { 300 } else if (tag == V_ASN1_INTEGER) {
299 ASN1_INTEGER *bs;
300 int i; 301 int i;
301 302
302 opp = op; 303 opp = op;
303 bs = d2i_ASN1_INTEGER(NULL, &opp, len + hl); 304 ai = d2i_ASN1_INTEGER(NULL, &opp, len + hl);
304 if (bs != NULL) { 305 if (ai != NULL) {
305 if (BIO_write(bp, ":", 1) <= 0) 306 if (BIO_write(bp, ":", 1) <= 0)
306 goto end; 307 goto end;
307 if (bs->type == V_ASN1_NEG_INTEGER) 308 if (ai->type == V_ASN1_NEG_INTEGER)
308 if (BIO_write(bp, "-", 1) <= 0) 309 if (BIO_write(bp, "-", 1) <= 0)
309 goto end; 310 goto end;
310 for (i = 0; i < bs->length; i++) { 311 for (i = 0; i < ai->length; i++) {
311 if (BIO_printf(bp, "%02X", 312 if (BIO_printf(bp, "%02X",
312 bs->data[i]) <= 0) 313 ai->data[i]) <= 0)
313 goto end; 314 goto end;
314 } 315 }
315 if (bs->length == 0) { 316 if (ai->length == 0) {
316 if (BIO_write(bp, "00", 2) <= 0) 317 if (BIO_write(bp, "00", 2) <= 0)
317 goto end; 318 goto end;
318 } 319 }
@@ -320,25 +321,25 @@ asn1_parse2(BIO *bp, const unsigned char **pp, long length, int offset,
320 if (BIO_write(bp, "BAD INTEGER", 11) <= 0) 321 if (BIO_write(bp, "BAD INTEGER", 11) <= 0)
321 goto end; 322 goto end;
322 } 323 }
323 ASN1_INTEGER_free(bs); 324 ASN1_INTEGER_free(ai);
325 ai = NULL;
324 } else if (tag == V_ASN1_ENUMERATED) { 326 } else if (tag == V_ASN1_ENUMERATED) {
325 ASN1_ENUMERATED *bs;
326 int i; 327 int i;
327 328
328 opp = op; 329 opp = op;
329 bs = d2i_ASN1_ENUMERATED(NULL, &opp, len + hl); 330 ae = d2i_ASN1_ENUMERATED(NULL, &opp, len + hl);
330 if (bs != NULL) { 331 if (ae != NULL) {
331 if (BIO_write(bp, ":", 1) <= 0) 332 if (BIO_write(bp, ":", 1) <= 0)
332 goto end; 333 goto end;
333 if (bs->type == V_ASN1_NEG_ENUMERATED) 334 if (ae->type == V_ASN1_NEG_ENUMERATED)
334 if (BIO_write(bp, "-", 1) <= 0) 335 if (BIO_write(bp, "-", 1) <= 0)
335 goto end; 336 goto end;
336 for (i = 0; i < bs->length; i++) { 337 for (i = 0; i < ae->length; i++) {
337 if (BIO_printf(bp, "%02X", 338 if (BIO_printf(bp, "%02X",
338 bs->data[i]) <= 0) 339 ae->data[i]) <= 0)
339 goto end; 340 goto end;
340 } 341 }
341 if (bs->length == 0) { 342 if (ae->length == 0) {
342 if (BIO_write(bp, "00", 2) <= 0) 343 if (BIO_write(bp, "00", 2) <= 0)
343 goto end; 344 goto end;
344 } 345 }
@@ -346,7 +347,8 @@ asn1_parse2(BIO *bp, const unsigned char **pp, long length, int offset,
346 if (BIO_write(bp, "BAD ENUMERATED", 14) <= 0) 347 if (BIO_write(bp, "BAD ENUMERATED", 14) <= 0)
347 goto end; 348 goto end;
348 } 349 }
349 ASN1_ENUMERATED_free(bs); 350 ASN1_ENUMERATED_free(ae);
351 ae = NULL;
350 } else if (len > 0 && dump) { 352 } else if (len > 0 && dump) {
351 if (!nl) { 353 if (!nl) {
352 if (BIO_write(bp, "\n", 1) <= 0) 354 if (BIO_write(bp, "\n", 1) <= 0)
@@ -377,6 +379,8 @@ end:
377 if (o != NULL) 379 if (o != NULL)
378 ASN1_OBJECT_free(o); 380 ASN1_OBJECT_free(o);
379 ASN1_OCTET_STRING_free(os); 381 ASN1_OCTET_STRING_free(os);
382 ASN1_INTEGER_free(ai);
383 ASN1_ENUMERATED_free(ae);
380 *pp = p; 384 *pp = p;
381 return (ret); 385 return (ret);
382} 386}