Fixups for STORE commit
[openssl.git] / crypto / store / store_register.c
index bde190e78eb7af15765266cfdd402f63820e9b93..6af7144f5c9b39109d37a0a90b155bb5ac1ea761 100644 (file)
@@ -30,12 +30,7 @@ DEFINE_RUN_ONCE_STATIC(do_registry_init)
 
 OSSL_STORE_LOADER *OSSL_STORE_LOADER_new(ENGINE *e, const char *scheme)
 {
-    OSSL_STORE_LOADER *res = OPENSSL_zalloc(sizeof(*res));
-
-    if (res == NULL) {
-        OSSL_STOREerr(OSSL_STORE_F_OSSL_STORE_LOADER_NEW, ERR_R_MALLOC_FAILURE);
-        return NULL;
-    }
+    OSSL_STORE_LOADER *res = NULL;
 
     /*
      * We usually don't check NULL arguments.  For loaders, though, the
@@ -49,6 +44,11 @@ OSSL_STORE_LOADER *OSSL_STORE_LOADER_new(ENGINE *e, const char *scheme)
         return NULL;
     }
 
+    if ((res = OPENSSL_zalloc(sizeof(*res))) == NULL) {
+        OSSL_STOREerr(OSSL_STORE_F_OSSL_STORE_LOADER_NEW, ERR_R_MALLOC_FAILURE);
+        return NULL;
+    }
+
     res->engine = e;
     res->scheme = scheme;
     return res;
@@ -123,11 +123,8 @@ static unsigned long store_loader_hash(const OSSL_STORE_LOADER *v)
 static int store_loader_cmp(const OSSL_STORE_LOADER *a,
                             const OSSL_STORE_LOADER *b)
 {
-    if (a->scheme != NULL && b->scheme != NULL)
-        return strcmp(a->scheme, b->scheme);
-    else if (a->scheme == b->scheme)
-        return 0;
-    return a->scheme == NULL ? -1 : 1;
+    assert(a->scheme != NULL && b->scheme != NULL);
+    return strcmp(a->scheme, b->scheme);
 }
 
 static LHASH_OF(OSSL_STORE_LOADER) *loader_register = NULL;
@@ -152,7 +149,15 @@ int ossl_store_register_loader_int(OSSL_STORE_LOADER *loader)
     if (*scheme != '\0') {
         OSSL_STOREerr(OSSL_STORE_F_OSSL_STORE_REGISTER_LOADER_INT,
                       OSSL_STORE_R_INVALID_SCHEME);
-        ERR_add_error_data(4, "scheme=", loader->scheme);
+        ERR_add_error_data(2, "scheme=", loader->scheme);
+        return 0;
+    }
+
+    /* Check that functions we absolutely require are present */
+    if (loader->open == NULL || loader->load == NULL || loader->eof == NULL
+        || loader->error == NULL || loader->close == NULL) {
+        OSSL_STOREerr(OSSL_STORE_F_OSSL_STORE_REGISTER_LOADER_INT,
+                      OSSL_STORE_R_LOADER_INCOMPLETE);
         return 0;
     }