summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/pkcs7
diff options
context:
space:
mode:
authormiod <>2014-07-10 21:40:59 +0000
committermiod <>2014-07-10 21:40:59 +0000
commita3e198dc1d41cb94dfec713fbae8cf56bf53201f (patch)
tree6aa39ccd3cabdc1887e9f7cd7c39fd94dbf3832e /src/lib/libcrypto/pkcs7
parent61a3ace0955bdebc19d27476839ed478301d0f1c (diff)
downloadopenbsd-a3e198dc1d41cb94dfec713fbae8cf56bf53201f.tar.gz
openbsd-a3e198dc1d41cb94dfec713fbae8cf56bf53201f.tar.bz2
openbsd-a3e198dc1d41cb94dfec713fbae8cf56bf53201f.zip
Fix a double free in a can't-fail error path in PKCS7_decrypt(), by removing
the error path altogether and simplifying the local variables as a result. joint work with jsing@; ok jsing@ tedu@
Diffstat (limited to 'src/lib/libcrypto/pkcs7')
-rw-r--r--src/lib/libcrypto/pkcs7/pk7_smime.c16
1 files changed, 6 insertions, 10 deletions
diff --git a/src/lib/libcrypto/pkcs7/pk7_smime.c b/src/lib/libcrypto/pkcs7/pk7_smime.c
index 5d174f7644..01734bdd1b 100644
--- a/src/lib/libcrypto/pkcs7/pk7_smime.c
+++ b/src/lib/libcrypto/pkcs7/pk7_smime.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: pk7_smime.c,v 1.15 2014/06/29 17:05:36 jsing Exp $ */ 1/* $OpenBSD: pk7_smime.c,v 1.16 2014/07/10 21:40:59 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 */
@@ -551,25 +551,21 @@ PKCS7_decrypt(PKCS7 *p7, EVP_PKEY *pkey, X509 *cert, BIO *data, int flags)
551 } 551 }
552 552
553 if (flags & PKCS7_TEXT) { 553 if (flags & PKCS7_TEXT) {
554 BIO *tmpbuf, *bread; 554 BIO *tmpbuf;
555
555 /* Encrypt BIOs can't do BIO_gets() so add a buffer BIO */ 556 /* Encrypt BIOs can't do BIO_gets() so add a buffer BIO */
556 if (!(tmpbuf = BIO_new(BIO_f_buffer()))) { 557 if (!(tmpbuf = BIO_new(BIO_f_buffer()))) {
557 PKCS7err(PKCS7_F_PKCS7_DECRYPT, ERR_R_MALLOC_FAILURE); 558 PKCS7err(PKCS7_F_PKCS7_DECRYPT, ERR_R_MALLOC_FAILURE);
558 BIO_free_all(tmpmem); 559 BIO_free_all(tmpmem);
559 return 0; 560 return 0;
560 } 561 }
561 if (!(bread = BIO_push(tmpbuf, tmpmem))) { 562 BIO_push(tmpbuf, tmpmem);
562 PKCS7err(PKCS7_F_PKCS7_DECRYPT, ERR_R_MALLOC_FAILURE); 563 ret = SMIME_text(tmpbuf, data);
563 BIO_free_all(tmpbuf);
564 BIO_free_all(tmpmem);
565 return 0;
566 }
567 ret = SMIME_text(bread, data);
568 if (ret > 0 && BIO_method_type(tmpmem) == BIO_TYPE_CIPHER) { 564 if (ret > 0 && BIO_method_type(tmpmem) == BIO_TYPE_CIPHER) {
569 if (!BIO_get_cipher_status(tmpmem)) 565 if (!BIO_get_cipher_status(tmpmem))
570 ret = 0; 566 ret = 0;
571 } 567 }
572 BIO_free_all(bread); 568 BIO_free_all(tmpbuf);
573 return ret; 569 return ret;
574 } else { 570 } else {
575 for (;;) { 571 for (;;) {