prov: add a safe memdup function for context cloning
[openssl.git] / providers / common / provider_util.c
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;
+}