In engine_table_select() don't clear out entire error queue: just clear
authorDr. Stephen Henson <steve@openssl.org>
Thu, 28 Jan 2010 17:53:11 +0000 (17:53 +0000)
committerDr. Stephen Henson <steve@openssl.org>
Thu, 28 Jan 2010 17:53:11 +0000 (17:53 +0000)
out any we added using ERR_set_mark() and ERR_pop_to_mark() otherwise
errors from other sources (e.g. SSL library) can be wiped.

crypto/engine/eng_table.c

index 8879a267d1432f8d1008c01e310bea9d8fc1c976..8fc47b3399c8982384e76c1ecc8bc1d8a77777fb 100644 (file)
@@ -237,6 +237,7 @@ ENGINE *engine_table_select_tmp(ENGINE_TABLE **table, int nid, const char *f, in
 #endif
                return NULL;
                }
+       ERR_set_mark();
        CRYPTO_w_lock(CRYPTO_LOCK_ENGINE);
        /* Check again inside the lock otherwise we could race against cleanup
         * operations. But don't worry about a fprintf(stderr). */
@@ -310,6 +311,6 @@ end:
        CRYPTO_w_unlock(CRYPTO_LOCK_ENGINE);
        /* Whatever happened, any failed init()s are not failures in this
         * context, so clear our error state. */
-       ERR_clear_error();
+       ERR_pop_to_mark();
        return ret;
        }