X-Git-Url: https://git.openssl.org/?p=openssl.git;a=blobdiff_plain;f=crypto%2Fstore%2Fstore_register.c;h=6af7144f5c9b39109d37a0a90b155bb5ac1ea761;hp=bde190e78eb7af15765266cfdd402f63820e9b93;hb=baa77e075538b3d849b5120b3b60f0caca15a803;hpb=f91ded1fc40bbe3950ae3e971d4c84a2edf039f8 diff --git a/crypto/store/store_register.c b/crypto/store/store_register.c index bde190e78e..6af7144f5c 100644 --- a/crypto/store/store_register.c +++ b/crypto/store/store_register.c @@ -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; }