prov: add a safe memdup function for context cloning
authorPauli <pauli@openssl.org>
Wed, 26 Jan 2022 04:21:51 +0000 (15:21 +1100)
committerPauli <pauli@openssl.org>
Tue, 1 Feb 2022 05:17:16 +0000 (16:17 +1100)
Reviewed-by: Shane Lontis <shane.lontis@oracle.com>
(Merged from https://github.com/openssl/openssl/pull/17572)

providers/common/include/prov/provider_util.h
providers/common/provider_util.c

index dfe91f29bcdbd8005ad0d0e734a394f7af330687..0bf7f9c3b1b3ae0042ef34875f18eed2f5197905 100644 (file)
@@ -136,3 +136,7 @@ typedef struct ag_capable_st {
  */
 void ossl_prov_cache_exported_algorithms(const OSSL_ALGORITHM_CAPABLE *in,
                                          OSSL_ALGORITHM *out);
+
+/* Duplicate a lump of memory safely */
+int ossl_prov_memdup(const void *src, size_t src_len,
+                     unsigned char **dest, size_t *dest_len);
index 58d4db33793f5ca8ae9904abe781ba4f4309fef5..3bcb0c9df3a25188ff6e09bac97479e593f73f11 100644 (file)
@@ -351,3 +351,20 @@ void ossl_prov_cache_exported_algorithms(const OSSL_ALGORITHM_CAPABLE *in,
         out[j++] = in[i].alg;
     }
 }
+
+/* Duplicate a lump of memory safely */
+int ossl_prov_memdup(const void *src, size_t src_len,
+                     unsigned char **dest, size_t *dest_len)
+{
+    if (src != NULL) {
+        if ((*dest = OPENSSL_memdup(src, src_len)) == NULL) {
+            ERR_raise(ERR_LIB_PROV, ERR_R_MALLOC_FAILURE);
+            return 0;
+        }
+        *dest_len = src_len;
+    } else {
+        *dest = NULL;
+        *dest_len = 0;
+    }
+    return 1;
+}