Fix EVP_PKEY_CTX propq so that it uses a copy
authorShane Lontis <shane.lontis@oracle.com>
Wed, 2 Dec 2020 10:54:08 +0000 (20:54 +1000)
committerShane Lontis <shane.lontis@oracle.com>
Thu, 3 Dec 2020 22:22:24 +0000 (08:22 +1000)
Reviewed-by: Tomas Mraz <tmraz@fedoraproject.org>
Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/12700)

crypto/evp/pmeth_lib.c
include/crypto/evp.h

index 903e30acf06f083cd60ade2a5bf1c3e52fd0eafd..2c2d93953817f6ce8f3cd102dc76a166e8397b43 100644 (file)
@@ -312,9 +312,14 @@ static EVP_PKEY_CTX *int_ctx_new(OSSL_LIB_CTX *libctx,
         EVP_KEYMGMT_free(keymgmt);
         return NULL;
     }
-
+    if (propquery != NULL) {
+        ret->propquery = OPENSSL_strdup(propquery);
+        if (ret->propquery == NULL) {
+            EVP_KEYMGMT_free(keymgmt);
+            return NULL;
+        }
+    }
     ret->libctx = libctx;
-    ret->propquery = propquery;
     ret->keytype = keytype;
     ret->keymgmt = keymgmt;
     ret->legacy_keytype = id;   /* TODO: Remove when #legacy key are gone */
@@ -397,6 +402,7 @@ void EVP_PKEY_CTX_free(EVP_PKEY_CTX *ctx)
 #endif
     EVP_KEYMGMT_free(ctx->keymgmt);
 
+    OPENSSL_free(ctx->propquery);
     EVP_PKEY_free(ctx->pkey);
     EVP_PKEY_free(ctx->peerkey);
 #if !defined(OPENSSL_NO_ENGINE) && !defined(FIPS_MODULE)
@@ -474,7 +480,14 @@ EVP_PKEY_CTX *EVP_PKEY_CTX_dup(const EVP_PKEY_CTX *pctx)
     rctx->operation = pctx->operation;
     rctx->libctx = pctx->libctx;
     rctx->keytype = pctx->keytype;
-    rctx->propquery = pctx->propquery;
+    rctx->propquery = NULL;
+    if (pctx->propquery != NULL) {
+        rctx->propquery = OPENSSL_strdup(pctx->propquery);
+        if (rctx->propquery == NULL) {
+            OPENSSL_free(rctx);
+            return NULL;
+        }
+    }
 
     if (EVP_PKEY_CTX_IS_DERIVE_OP(pctx)) {
         if (pctx->op.kex.exchange != NULL) {
index 6eac2a0b6312d6640afb48cd94be108feada26c2..c6cbd787a78e60a3c51a333dd5689dba6f130ab7 100644 (file)
@@ -43,7 +43,7 @@ struct evp_pkey_ctx_st {
      * this context
      */
     OSSL_LIB_CTX *libctx;
-    const char *propquery;
+    char *propquery;
     const char *keytype;
     EVP_KEYMGMT *keymgmt;