Make EVP_Encrypt*/EVP_Decrypt* and EVP_Cipher* provider aware
[openssl.git] / crypto / ex_data.c
index a728bfbbd375dd3203db257d018260d5ea0337e4..5f83191bae3aeaaf2d98363edc3f3e9e9eccb22f 100644 (file)
@@ -235,7 +235,7 @@ int CRYPTO_new_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *ad)
         return 0;
     }
     for (i = 0; i < mx; i++) {
-        if (storage[i] && storage[i]->new_func) {
+        if (storage[i] != NULL && storage[i]->new_func != NULL) {
             ptr = CRYPTO_get_ex_data(ad, i);
             storage[i]->new_func(obj, ptr, ad, i,
                                  storage[i]->argl, storage[i]->argp);
@@ -299,7 +299,7 @@ int CRYPTO_dup_ex_data(int class_index, CRYPTO_EX_DATA *to,
 
     for (i = 0; i < mx; i++) {
         ptr = CRYPTO_get_ex_data(from, i);
-        if (storage[i] && storage[i]->dup_func)
+        if (storage[i] != NULL && storage[i]->dup_func != NULL)
             if (!storage[i]->dup_func(to, from, &ptr, i,
                                       storage[i]->argl, storage[i]->argp))
                 goto err;
@@ -380,6 +380,8 @@ int CRYPTO_alloc_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *ad,
         return 1;
 
     ip = get_and_lock(class_index);
+    if (ip == NULL)
+        return 0;
     f = sk_EX_CALLBACK_value(ip->meth, idx);
     CRYPTO_THREAD_unlock(ex_data_lock);
 
@@ -387,6 +389,9 @@ int CRYPTO_alloc_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *ad,
      * This should end up calling CRYPTO_set_ex_data(), which allocates
      * everything necessary to support placing the new data in the right spot.
      */
+    if (f->new_func == NULL)
+        return 0;
+
     f->new_func(obj, curval, ad, idx, f->argl, f->argp);
 
     return 1;