summaryrefslogtreecommitdiffstats
path: root/providers
diff options
context:
space:
mode:
authorHuiyue Xu <xuhuiyue@huawei.com>2023-11-22 09:55:27 +0800
committerHugo Landau <hlandau@openssl.org>2023-11-23 15:09:05 +0000
commit022e2d56c7f8204f40949f2feebfd7781829ee98 (patch)
tree73df87d5e8cbfb09cee837d72b3838a1a48b95de /providers
parenteef9951e72ca2d55325493a500c286be524a2d02 (diff)
Fix a possible memory leak in SM2 provider
ctx->propq that strdup from input parameter propq in sm2sig_newctx, is not released. It should be released in sm2sig_freectx and copied to dstctx in sm2sig_dupctx. And dstctx->id and dstctx->propq should be set NULL to avoid releasing id/propq of srcctx when err occurs. Signed-off-by: Huiyue Xu <xuhuiyue@huawei.com> Reviewed-by: Tomas Mraz <tomas@openssl.org> Reviewed-by: Matt Caswell <matt@openssl.org> Reviewed-by: Paul Yang <kaishen.yy@antfin.com> Reviewed-by: Hugo Landau <hlandau@openssl.org> (Merged from https://github.com/openssl/openssl/pull/22796) (cherry picked from commit e7d34d7ae32f16abbd79a49072cff580bee32269)
Diffstat (limited to 'providers')
-rw-r--r--providers/implementations/signature/sm2_sig.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/providers/implementations/signature/sm2_sig.c b/providers/implementations/signature/sm2_sig.c
index b3647a9a73..3e4ac2d0c5 100644
--- a/providers/implementations/signature/sm2_sig.c
+++ b/providers/implementations/signature/sm2_sig.c
@@ -330,6 +330,7 @@ static void sm2sig_freectx(void *vpsm2ctx)
free_md(ctx);
EC_KEY_free(ctx->ec);
+ OPENSSL_free(ctx->propq);
OPENSSL_free(ctx->id);
OPENSSL_free(ctx);
}
@@ -345,13 +346,21 @@ static void *sm2sig_dupctx(void *vpsm2ctx)
*dstctx = *srcctx;
dstctx->ec = NULL;
+ dstctx->propq = NULL;
dstctx->md = NULL;
dstctx->mdctx = NULL;
+ dstctx->id = NULL;
if (srcctx->ec != NULL && !EC_KEY_up_ref(srcctx->ec))
goto err;
dstctx->ec = srcctx->ec;
+ if (srcctx->propq != NULL) {
+ dstctx->propq = OPENSSL_strdup(srcctx->propq);
+ if (dstctx->propq == NULL)
+ goto err;
+ }
+
if (srcctx->md != NULL && !EVP_MD_up_ref(srcctx->md))
goto err;
dstctx->md = srcctx->md;