From 67cc2bae02fdcc0d9409861d1e941e72774411ba Mon Sep 17 00:00:00 2001 From: Nicola Tuveri Date: Tue, 10 Apr 2018 03:19:30 +0300 Subject: [PATCH] [SM2_sign] fix double free and return value MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Currently, critical bugs prevent using SM2 signatures through the `EVP_PKEY` interface: any application that managed to satisfy the requirement of forcing SM3 as the message digest – even if this is currently not possible transparently through the `EVP_PKEY` interface and requires manually forcing the MD selection – would crash with a segmentation fault upon calling the `SM2_sign()` function. This is easily verified using the OpenSSL CLI to execute this critical code path under the right conditions: `openssl dgst -sm3 -hex -sign sm2.eckey /path/to/file/to/sign` The issue is caused by a double free at the end of `SM2_sign()` in `crypto/sm2/sm2_sign.c` in case of successful signature generation. In addition, even if the double free was not causing segfaults, the function returns the wrong return value in case of success (it would return 0 rather than 1). This patch fixes both problems. Reviewed-by: Bernd Edlinger Reviewed-by: Matt Caswell (Merged from https://github.com/openssl/openssl/pull/6066) --- crypto/sm2/sm2_sign.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/crypto/sm2/sm2_sign.c b/crypto/sm2/sm2_sign.c index 12ccd28bcf..e12eca12fb 100644 --- a/crypto/sm2/sm2_sign.c +++ b/crypto/sm2/sm2_sign.c @@ -279,9 +279,7 @@ int SM2_sign(int type, const unsigned char *dgst, int dgstlen, *siglen = i2d_ECDSA_SIG(s, &sig); - ECDSA_SIG_free(s); - - ret = 0; + ret = 1; done: ECDSA_SIG_free(s); -- 2.25.1