diff options
author | Paul Yang <kaishen.yy@antfin.com> | 2019-09-21 00:32:57 +0800 |
---|---|---|
committer | Paul Yang <kaishen.yy@antfin.com> | 2019-09-29 09:54:19 +0800 |
commit | dbb72124cdf1ad0dc223cfd570219e9af043ce7f (patch) | |
tree | 5a4058e351a6420919b38952f1a0088fe1a44a05 /apps/req.c | |
parent | e7fb44e7c3f7a37ff83a6b69ba51a738e549bf5c (diff) |
Fix a double free issue when signing SM2 cert
If the SM2 ID value has not been passed correctly when signing an SM2
certificate/certificate request, a double free occurs. For instance:
openssl req -x509 ... -sm2-id 1234567812345678
The '-sm2-id' should not be used in this scenario, while the '-sigopt' is
the correct one to use. Documentation has also been updated to make the
options more clear.
Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/9958)
Diffstat (limited to 'apps/req.c')
-rw-r--r-- | apps/req.c | 48 |
1 files changed, 30 insertions, 18 deletions
diff --git a/apps/req.c b/apps/req.c index f11d341c12..1c9672cca1 100644 --- a/apps/req.c +++ b/apps/req.c @@ -1751,15 +1751,19 @@ int do_X509_sign(X509 *x, EVP_PKEY *pkey, const EVP_MD *md, #endif rv = do_sign_init(mctx, pkey, md, sigopts); - if (rv > 0) + if (rv > 0) { rv = X509_sign_ctx(x, mctx); #ifndef OPENSSL_NO_SM2 - /* only in SM2 case we need to free the pctx explicitly */ - if (ec_pkey_is_sm2(pkey)) { - pctx = EVP_MD_CTX_pkey_ctx(mctx); - EVP_PKEY_CTX_free(pctx); - } + /* + * only in SM2 case we need to free the pctx explicitly + * if do_sign_init() fails, pctx is already freed in it + */ + if (ec_pkey_is_sm2(pkey)) { + pctx = EVP_MD_CTX_pkey_ctx(mctx); + EVP_PKEY_CTX_free(pctx); + } #endif + } EVP_MD_CTX_free(mctx); return rv > 0 ? 1 : 0; } @@ -1774,15 +1778,19 @@ int do_X509_REQ_sign(X509_REQ *x, EVP_PKEY *pkey, const EVP_MD *md, #endif rv = do_sign_init(mctx, pkey, md, sigopts); - if (rv > 0) + if (rv > 0) { rv = X509_REQ_sign_ctx(x, mctx); #ifndef OPENSSL_NO_SM2 - /* only in SM2 case we need to free the pctx explicitly */ - if (ec_pkey_is_sm2(pkey)) { - pctx = EVP_MD_CTX_pkey_ctx(mctx); - EVP_PKEY_CTX_free(pctx); - } + /* + * only in SM2 case we need to free the pctx explicitly + * if do_sign_init() fails, pctx is already freed in it + */ + if (ec_pkey_is_sm2(pkey)) { + pctx = EVP_MD_CTX_pkey_ctx(mctx); + EVP_PKEY_CTX_free(pctx); + } #endif + } EVP_MD_CTX_free(mctx); return rv > 0 ? 1 : 0; } @@ -1797,15 +1805,19 @@ int do_X509_CRL_sign(X509_CRL *x, EVP_PKEY *pkey, const EVP_MD *md, #endif rv = do_sign_init(mctx, pkey, md, sigopts); - if (rv > 0) + if (rv > 0) { rv = X509_CRL_sign_ctx(x, mctx); #ifndef OPENSSL_NO_SM2 - /* only in SM2 case we need to free the pctx explicitly */ - if (ec_pkey_is_sm2(pkey)) { - pctx = EVP_MD_CTX_pkey_ctx(mctx); - EVP_PKEY_CTX_free(pctx); - } + /* + * only in SM2 case we need to free the pctx explicitly + * if do_sign_init() fails, no need to double free pctx + */ + if (ec_pkey_is_sm2(pkey)) { + pctx = EVP_MD_CTX_pkey_ctx(mctx); + EVP_PKEY_CTX_free(pctx); + } #endif + } EVP_MD_CTX_free(mctx); return rv > 0 ? 1 : 0; } |