In engine_table_select() don't clear out entire error queue: just clear
authorDr. Stephen Henson <steve@openssl.org>
Thu, 28 Jan 2010 17:50:23 +0000 (17:50 +0000)
committerDr. Stephen Henson <steve@openssl.org>
Thu, 28 Jan 2010 17:50:23 +0000 (17:50 +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.

apps/s_server.c
crypto/engine/eng_table.c

index 1a06d19bb14be9ddf1af9d777012317d149dd06b..85d060a410b49496d8645e684856b08e17f8b338 100644 (file)
@@ -2391,6 +2391,17 @@ static int www_body(char *hostname, int s, unsigned char *context)
                        STACK_OF(SSL_CIPHER) *sk;
                        static const char *space="                          ";
 
+               if (www == 1 && strncmp("GET /reneg", buf, 10) == 0)
+                       {
+                       if (strncmp("GET /renegcert", buf, 14) == 0)
+                               SSL_set_verify(con,
+                               SSL_VERIFY_PEER|SSL_VERIFY_CLIENT_ONCE,NULL);
+                       SSL_renegotiate(con);
+                       i=SSL_do_handshake(con);
+                       BIO_puts(bio_s_out, "RENEGOTIATING\n");
+                       BIO_printf(bio_s_out, "SSL_do_handshake -> %d\n",i);
+                       }
+
                        BIO_puts(io,"HTTP/1.0 200 ok\r\nContent-type: text/html\r\n\r\n");
                        BIO_puts(io,"<HTML><BODY BGCOLOR=\"#ffffff\">\n");
                        BIO_puts(io,"<pre>\n");
index 954b4d79702c6ddb8ee47b906c4b0cef96cc9745..4fde9481852c0e47c7d2062182b72207db01cc21 100644 (file)
@@ -254,6 +254,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). */
@@ -327,7 +328,7 @@ 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;
        }