diff options
author | Richard Levitte <levitte@openssl.org> | 2017-08-05 14:56:13 +0200 |
---|---|---|
committer | Richard Levitte <levitte@openssl.org> | 2017-08-15 14:28:23 +0200 |
commit | 140dab3d3a099feb38d5987adb471c61a8eabb4b (patch) | |
tree | bcd209168fc2ef52dbe4be349e81971346b24e19 /crypto | |
parent | e1a4ff7678ef8fd2d67416f84a7408e826c7dccc (diff) |
Clear error stack on successful OSSL_STORE_open()
Since OSSL_STORE_open() tries with the 'file' scheme loader first, and
then on the loader implied by the URI if the former fails, the former
leaves an error on the error stack. This is confusing, so let's clear
the error stack on success. The implementation uses ERR_set_mark,
ERR_pop_to_mark and ERR_clear_last_mark to make sure caller errors are
preserved as much as possible.
Fixes #4089
Reviewed-by: Andy Polyakov <appro@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/4094)
Diffstat (limited to 'crypto')
-rw-r--r-- | crypto/store/store_lib.c | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/crypto/store/store_lib.c b/crypto/store/store_lib.c index b982e9c753..6f789eb79c 100644 --- a/crypto/store/store_lib.c +++ b/crypto/store/store_lib.c @@ -64,28 +64,39 @@ OSSL_STORE_CTX *OSSL_STORE_open(const char *uri, const UI_METHOD *ui_method, } } + ERR_set_mark(); + /* Try each scheme until we find one that could open the URI */ for (i = 0; loader_ctx == NULL && i < schemes_n; i++) { if ((loader = ossl_store_get0_loader_int(schemes[i])) != NULL) loader_ctx = loader->open(loader, uri, ui_method, ui_data); } if (loader_ctx == NULL) - goto done; + goto err; if ((ctx = OPENSSL_zalloc(sizeof(*ctx))) == NULL) { OSSL_STOREerr(OSSL_STORE_F_OSSL_STORE_OPEN, ERR_R_MALLOC_FAILURE); - goto done; + goto err; } ctx->loader = loader; ctx->loader_ctx = loader_ctx; - loader_ctx = NULL; ctx->ui_method = ui_method; ctx->ui_data = ui_data; ctx->post_process = post_process; ctx->post_process_data = post_process_data; - done: + /* + * If the attempt to open with the 'file' scheme loader failed and the + * other scheme loader succeeded, the failure to open with the 'file' + * scheme loader leaves an error on the error stack. Let's remove it. + */ + ERR_pop_to_mark(); + + return ctx; + + err: + ERR_clear_last_mark(); if (loader_ctx != NULL) { /* * We ignore a returned error because we will return NULL anyway in @@ -94,7 +105,7 @@ OSSL_STORE_CTX *OSSL_STORE_open(const char *uri, const UI_METHOD *ui_method, */ (void)loader->close(loader_ctx); } - return ctx; + return NULL; } int OSSL_STORE_ctrl(OSSL_STORE_CTX *ctx, int cmd, ...) |