diff options
author | Dr. Stephen Henson <steve@openssl.org> | 2008-04-11 23:45:52 +0000 |
---|---|---|
committer | Dr. Stephen Henson <steve@openssl.org> | 2008-04-11 23:45:52 +0000 |
commit | 852bd35065cd9c92a3c98b5606533e575280a307 (patch) | |
tree | 034c135b2c2f11781a73a1967d87709228393283 /crypto/cms/cms_smime.c | |
parent | a5db50d005637faba968b4173f2e81f07ebd7469 (diff) |
Fix prototype for CMS_decrypt(), don't free up detached content.
Diffstat (limited to 'crypto/cms/cms_smime.c')
-rw-r--r-- | crypto/cms/cms_smime.c | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/crypto/cms/cms_smime.c b/crypto/cms/cms_smime.c index 6f44c84a5f..42b3efb4e2 100644 --- a/crypto/cms/cms_smime.c +++ b/crypto/cms/cms_smime.c @@ -125,6 +125,23 @@ static int check_content(CMS_ContentInfo *cms) return 1; } +static void do_free_upto(BIO *f, BIO *upto) + { + if (upto) + { + BIO *tbio; + do + { + tbio = BIO_pop(f); + BIO_free(f); + f = tbio; + } + while (f != upto); + } + else + BIO_free_all(f); + } + int CMS_data(CMS_ContentInfo *cms, BIO *out, unsigned int flags) { BIO *cont; @@ -177,7 +194,7 @@ int CMS_digest_verify(CMS_ContentInfo *cms, BIO *dcont, BIO *out, r = cms_copy_content(out, cont, flags); if (r) r = cms_DigestedData_do_final(cms, cont, 1); - BIO_free_all(cont); + do_free_upto(cont, dcont); return r; } @@ -223,7 +240,7 @@ int CMS_EncryptedData_decrypt(CMS_ContentInfo *cms, if (!cont) return 0; r = cms_copy_content(out, cont, flags); - BIO_free_all(cont); + do_free_upto(cont, dcont); return r; } @@ -411,8 +428,9 @@ int CMS_verify(CMS_ContentInfo *cms, STACK_OF(X509) *certs, err: if (dcont && (tmpin == dcont)) - BIO_pop(cmsbio); - BIO_free_all(cmsbio); + do_free_upto(cmsbio, dcont); + else + BIO_free_all(cmsbio); if (cms_certs) sk_X509_pop_free(cms_certs, X509_free); @@ -678,7 +696,7 @@ int CMS_decrypt(CMS_ContentInfo *cms, EVP_PKEY *pk, X509 *cert, if (!cont) return 0; r = cms_copy_content(out, cont, flags); - BIO_free_all(cont); + do_free_upto(cont, dcont); return r; } @@ -706,7 +724,7 @@ int CMS_final(CMS_ContentInfo *cms, BIO *data, BIO *dcont, unsigned int flags) ret = 1; err: - BIO_free_all(cmsbio); + do_free_upto(cmsbio, dcont); return ret; @@ -733,7 +751,7 @@ int CMS_uncompress(CMS_ContentInfo *cms, BIO *dcont, BIO *out, if (!cont) return 0; r = cms_copy_content(out, cont, flags); - BIO_free_all(cont); + do_free_upto(cont, dcont); return r; } |