summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormiod <>2015-02-08 22:17:49 +0000
committermiod <>2015-02-08 22:17:49 +0000
commit705f4ae838e975ff98c0985c32bc9d2b86d6b715 (patch)
treea68379f70a40495cdcec2c96e351e4417641551e /src
parent2179ddc2e9ec9e8527a6a060f97ba8d89787f82b (diff)
downloadopenbsd-705f4ae838e975ff98c0985c32bc9d2b86d6b715.tar.gz
openbsd-705f4ae838e975ff98c0985c32bc9d2b86d6b715.tar.bz2
openbsd-705f4ae838e975ff98c0985c32bc9d2b86d6b715.zip
Check memory allocation results, as well as stack pushes.
Also fix a memory leak in one of the error paths of SMIME_read_ASN1(), spotted by doug@ tweaks&ok doug@ jsing@
Diffstat (limited to 'src')
-rw-r--r--src/lib/libcrypto/asn1/asn_mime.c43
-rw-r--r--src/lib/libssl/src/crypto/asn1/asn_mime.c43
2 files changed, 68 insertions, 18 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
613static int 614static int
614multi_split(BIO *bio, char *bound, STACK_OF(BIO) **ret) 615multi_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
791merr:
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
776static char * 798static 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;
889err: 914err:
890 free(tmpname); 915 free(tmpname);
diff --git a/src/lib/libssl/src/crypto/asn1/asn_mime.c b/src/lib/libssl/src/crypto/asn1/asn_mime.c
index afa0abd696..461ee16a4b 100644
--- a/src/lib/libssl/src/crypto/asn1/asn_mime.c
+++ b/src/lib/libssl/src/crypto/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
613static int 614static int
614multi_split(BIO *bio, char *bound, STACK_OF(BIO) **ret) 615multi_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
791merr:
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
776static char * 798static 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;
889err: 914err:
890 free(tmpname); 915 free(tmpname);