summaryrefslogtreecommitdiffstats
path: root/crypto/cms
diff options
context:
space:
mode:
authorDr. Stephen Henson <steve@openssl.org>2008-04-11 23:45:52 +0000
committerDr. Stephen Henson <steve@openssl.org>2008-04-11 23:45:52 +0000
commit852bd35065cd9c92a3c98b5606533e575280a307 (patch)
tree034c135b2c2f11781a73a1967d87709228393283 /crypto/cms
parenta5db50d005637faba968b4173f2e81f07ebd7469 (diff)
Fix prototype for CMS_decrypt(), don't free up detached content.
Diffstat (limited to 'crypto/cms')
-rw-r--r--crypto/cms/cms.h2
-rw-r--r--crypto/cms/cms_smime.c32
2 files changed, 26 insertions, 8 deletions
diff --git a/crypto/cms/cms.h b/crypto/cms/cms.h
index 9b32231d70..feddd24fca 100644
--- a/crypto/cms/cms.h
+++ b/crypto/cms/cms.h
@@ -177,7 +177,7 @@ CMS_ContentInfo *CMS_encrypt(STACK_OF(X509) *certs, BIO *in,
const EVP_CIPHER *cipher, unsigned int flags);
int CMS_decrypt(CMS_ContentInfo *cms, EVP_PKEY *pkey, X509 *cert,
- BIO *data, BIO *dcont,
+ BIO *dcont, BIO *out,
unsigned int flags);
int CMS_decrypt_set1_pkey(CMS_ContentInfo *cms, EVP_PKEY *pk, X509 *cert);
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;
}