diff options
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libcrypto/asn1/asn_mime.c | 43 |
1 files changed, 34 insertions, 9 deletions
diff --git a/src/lib/libcrypto/asn1/asn_mime.c b/src/lib/libcrypto/asn1/asn_mime.c index afa0abd696..461ee16a4b 100644 --- a/src/lib/libcrypto/asn1/asn_mime.c +++ b/src/lib/libcrypto/asn1/asn_mime.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: asn_mime.c,v 1.23 2014/10/22 13:02:03 jsing Exp $ */ | 1 | /* $OpenBSD: asn_mime.c,v 1.24 2015/02/08 22:17:49 miod 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. | 3 | * project. |
| 4 | */ | 4 | */ |
| @@ -487,6 +487,7 @@ SMIME_read_ASN1(BIO *bio, BIO **bcont, const ASN1_ITEM *it) | |||
| 487 | if (!(hdr = mime_hdr_find(headers, "content-type")) || | 487 | if (!(hdr = mime_hdr_find(headers, "content-type")) || |
| 488 | !hdr->value) { | 488 | !hdr->value) { |
| 489 | sk_MIME_HEADER_pop_free(headers, mime_hdr_free); | 489 | sk_MIME_HEADER_pop_free(headers, mime_hdr_free); |
| 490 | sk_BIO_pop_free(parts, BIO_vfree); | ||
| 490 | ASN1err(ASN1_F_SMIME_READ_ASN1, | 491 | ASN1err(ASN1_F_SMIME_READ_ASN1, |
| 491 | ASN1_R_NO_SIG_CONTENT_TYPE); | 492 | ASN1_R_NO_SIG_CONTENT_TYPE); |
| 492 | return NULL; | 493 | return NULL; |
| @@ -606,10 +607,10 @@ SMIME_text(BIO *in, BIO *out) | |||
| 606 | return 1; | 607 | return 1; |
| 607 | } | 608 | } |
| 608 | 609 | ||
| 609 | /* Split a multipart/XXX message body into component parts: result is | 610 | /* |
| 611 | * Split a multipart/XXX message body into component parts: result is | ||
| 610 | * canonical parts in a STACK of bios | 612 | * canonical parts in a STACK of bios |
| 611 | */ | 613 | */ |
| 612 | |||
| 613 | static int | 614 | static int |
| 614 | multi_split(BIO *bio, char *bound, STACK_OF(BIO) **ret) | 615 | multi_split(BIO *bio, char *bound, STACK_OF(BIO) **ret) |
| 615 | { | 616 | { |
| @@ -626,22 +627,29 @@ multi_split(BIO *bio, char *bound, STACK_OF(BIO) **ret) | |||
| 626 | first = 1; | 627 | first = 1; |
| 627 | parts = sk_BIO_new_null(); | 628 | parts = sk_BIO_new_null(); |
| 628 | *ret = parts; | 629 | *ret = parts; |
| 630 | if (parts == NULL) | ||
| 631 | return 0; | ||
| 629 | while ((len = BIO_gets(bio, linebuf, MAX_SMLEN)) > 0) { | 632 | while ((len = BIO_gets(bio, linebuf, MAX_SMLEN)) > 0) { |
| 630 | state = mime_bound_check(linebuf, len, bound, blen); | 633 | state = mime_bound_check(linebuf, len, bound, blen); |
| 631 | if (state == 1) { | 634 | if (state == 1) { |
| 632 | first = 1; | 635 | first = 1; |
| 633 | part++; | 636 | part++; |
| 634 | } else if (state == 2) { | 637 | } else if (state == 2) { |
| 635 | sk_BIO_push(parts, bpart); | 638 | if (sk_BIO_push(parts, bpart) == 0) |
| 639 | return 0; | ||
| 636 | return 1; | 640 | return 1; |
| 637 | } else if (part) { | 641 | } else if (part) { |
| 638 | /* Strip CR+LF from linebuf */ | 642 | /* Strip CR+LF from linebuf */ |
| 639 | next_eol = strip_eol(linebuf, &len); | 643 | next_eol = strip_eol(linebuf, &len); |
| 640 | if (first) { | 644 | if (first) { |
| 641 | first = 0; | 645 | first = 0; |
| 642 | if (bpart) | 646 | if (bpart != NULL) { |
| 643 | sk_BIO_push(parts, bpart); | 647 | if (sk_BIO_push(parts, bpart) == 0) |
| 648 | return 0; | ||
| 649 | } | ||
| 644 | bpart = BIO_new(BIO_s_mem()); | 650 | bpart = BIO_new(BIO_s_mem()); |
| 651 | if (bpart == NULL) | ||
| 652 | return 0; | ||
| 645 | BIO_set_mem_eof_return(bpart, 0); | 653 | BIO_set_mem_eof_return(bpart, 0); |
| 646 | } else if (eol) | 654 | } else if (eol) |
| 647 | BIO_write(bpart, "\r\n", 2); | 655 | BIO_write(bpart, "\r\n", 2); |
| @@ -650,6 +658,7 @@ multi_split(BIO *bio, char *bound, STACK_OF(BIO) **ret) | |||
| 650 | BIO_write(bpart, linebuf, len); | 658 | BIO_write(bpart, linebuf, len); |
| 651 | } | 659 | } |
| 652 | } | 660 | } |
| 661 | BIO_free(bpart); | ||
| 653 | return 0; | 662 | return 0; |
| 654 | } | 663 | } |
| 655 | 664 | ||
| @@ -709,7 +718,11 @@ STACK_OF(MIME_HEADER) *mime_parse_hdr(BIO *bio) | |||
| 709 | *p = 0; | 718 | *p = 0; |
| 710 | mhdr = mime_hdr_new(ntmp, | 719 | mhdr = mime_hdr_new(ntmp, |
| 711 | strip_ends(q)); | 720 | strip_ends(q)); |
| 712 | sk_MIME_HEADER_push(headers, mhdr); | 721 | if (mhdr == NULL) |
| 722 | goto merr; | ||
| 723 | if (sk_MIME_HEADER_push(headers, | ||
| 724 | mhdr) == 0) | ||
| 725 | goto merr; | ||
| 713 | ntmp = NULL; | 726 | ntmp = NULL; |
| 714 | q = p + 1; | 727 | q = p + 1; |
| 715 | state = MIME_NAME; | 728 | state = MIME_NAME; |
| @@ -762,7 +775,10 @@ STACK_OF(MIME_HEADER) *mime_parse_hdr(BIO *bio) | |||
| 762 | 775 | ||
| 763 | if (state == MIME_TYPE) { | 776 | if (state == MIME_TYPE) { |
| 764 | mhdr = mime_hdr_new(ntmp, strip_ends(q)); | 777 | mhdr = mime_hdr_new(ntmp, strip_ends(q)); |
| 765 | sk_MIME_HEADER_push(headers, mhdr); | 778 | if (mhdr == NULL) |
| 779 | goto merr; | ||
| 780 | if (sk_MIME_HEADER_push(headers, mhdr) == 0) | ||
| 781 | goto merr; | ||
| 766 | } else if (state == MIME_VALUE) | 782 | } else if (state == MIME_VALUE) |
| 767 | mime_hdr_addparam(mhdr, ntmp, strip_ends(q)); | 783 | mime_hdr_addparam(mhdr, ntmp, strip_ends(q)); |
| 768 | 784 | ||
| @@ -771,6 +787,12 @@ STACK_OF(MIME_HEADER) *mime_parse_hdr(BIO *bio) | |||
| 771 | } | 787 | } |
| 772 | 788 | ||
| 773 | return headers; | 789 | return headers; |
| 790 | |||
| 791 | merr: | ||
| 792 | if (mhdr != NULL) | ||
| 793 | mime_hdr_free(mhdr); | ||
| 794 | sk_MIME_HEADER_pop_free(headers, mime_hdr_free); | ||
| 795 | return NULL; | ||
| 774 | } | 796 | } |
| 775 | 797 | ||
| 776 | static char * | 798 | static char * |
| @@ -884,7 +906,10 @@ mime_hdr_addparam(MIME_HEADER *mhdr, char *name, char *value) | |||
| 884 | goto err; | 906 | goto err; |
| 885 | mparam->param_name = tmpname; | 907 | mparam->param_name = tmpname; |
| 886 | mparam->param_value = tmpval; | 908 | mparam->param_value = tmpval; |
| 887 | sk_MIME_PARAM_push(mhdr->params, mparam); | 909 | if (sk_MIME_PARAM_push(mhdr->params, mparam) == 0) { |
| 910 | free(mparam); | ||
| 911 | goto err; | ||
| 912 | } | ||
| 888 | return 1; | 913 | return 1; |
| 889 | err: | 914 | err: |
| 890 | free(tmpname); | 915 | free(tmpname); |
