diff --git a/src/ssl.c b/src/ssl.c index 4c1fcd4fc..9a95704ed 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -17568,7 +17568,12 @@ int wolfSSL_set_compression(WOLFSSL* ssl) wolfSSL_BIO_free(ssl->biord); ssl->biord = NULL; } - + /* set flag obviously */ + if (rd && !(rd->flags & WOLFSSL_BIO_FLAG_READ)) + rd->flags |= WOLFSSL_BIO_FLAG_READ; + if (wr && !(wr->flags & WOLFSSL_BIO_FLAG_WRITE)) + wr->flags |= WOLFSSL_BIO_FLAG_WRITE; + ssl->biord = rd; ssl->biowr = wr; diff --git a/tests/api.c b/tests/api.c index 96eabe0c9..2f0db3728 100644 --- a/tests/api.c +++ b/tests/api.c @@ -38776,6 +38776,44 @@ static void test_wolfSSL_BIO_connect(void) #endif } + +static void test_wolfSSL_BIO_Qt_usecase() +{ +#if !defined(NO_BIO) && defined(OPENSSL_EXTRA) && !defined(NO_WOLFSSL_CLIENT) + + printf(testingFmt, "test_wolfSSL_BIO_Qt_usecase()"); + + SSL_CTX* ctx; + SSL *ssl; + BIO *readBio; + BIO *writeBio; + int ret, err; + + AssertNotNull(ctx = SSL_CTX_new(SSLv23_method())); + AssertNotNull(ssl = SSL_new(ctx)); + + AssertNotNull(readBio = BIO_new(BIO_s_mem())); + AssertNotNull(writeBio = BIO_new(BIO_s_mem())); + /* Qt reads data from write-bio, + * then writes the read data into plain packet. + * Qt reads data from plain packet, + * then writes the read data into read-bio. + */ + SSL_set_bio(ssl, readBio, writeBio); + AssertIntEQ(ret = SSL_connect(ssl), WOLFSSL_FATAL_ERROR); + err = SSL_get_error(ssl, ret); + /* in this use case, should return WANT READ + * so that Qt will read the data from plain packet for next state. + */ + AssertIntEQ(err, SSL_ERROR_WANT_READ); + + SSL_free(ssl); + SSL_CTX_free(ctx); + + printf(resultFmt, passed); +#endif +} + #if defined(OPENSSL_ALL) && defined(HAVE_IO_TESTS_DEPENDENCIES) && defined(HAVE_HTTP_CLIENT) static THREAD_RETURN WOLFSSL_THREAD test_wolfSSL_BIO_accept_client(void* args) { @@ -52685,6 +52723,7 @@ void ApiTest(void) test_wolfSSL_BIO_printf(); test_wolfSSL_BIO_f_md(); test_wolfSSL_BIO_up_ref(); + test_wolfSSL_BIO_Qt_usecase(); #endif test_wolfSSL_cert_cb(); test_wolfSSL_SESSION();