mirror of
https://github.com/wolfSSL/wolfssl.git
synced 2025-07-30 18:57:27 +02:00
Fix for BIO with callbacks not called after PR #3824 (was always returning WANT_READ).
This commit is contained in:
17
src/bio.c
17
src/bio.c
@ -213,7 +213,7 @@ int wolfSSL_BIO_read(WOLFSSL_BIO* bio, void* buf, int len)
|
||||
if (bio->method && bio->method->readCb) {
|
||||
ret = bio->method->readCb(bio, (char*)buf, len);
|
||||
}
|
||||
|
||||
else {
|
||||
/* formatting data */
|
||||
if (bio->type == WOLFSSL_BIO_BASE64 && ret > 0 && sz > 0) {
|
||||
ret = wolfSSL_BIO_BASE64_read(bio, buf, sz);
|
||||
@ -254,6 +254,7 @@ int wolfSSL_BIO_read(WOLFSSL_BIO* bio, void* buf, int len)
|
||||
if (bio->type == WOLFSSL_BIO_SOCKET) {
|
||||
ret = wolfIO_Recv(bio->num, (char*)buf, len, 0);
|
||||
}
|
||||
}
|
||||
|
||||
/* case where front of list is done */
|
||||
if (bio == front) {
|
||||
@ -263,6 +264,12 @@ int wolfSSL_BIO_read(WOLFSSL_BIO* bio, void* buf, int len)
|
||||
if (ret > 0) {
|
||||
sz = ret; /* adjust size for formatting */
|
||||
}
|
||||
else {
|
||||
if (wolfSSL_BIO_supports_pending(bio) &&
|
||||
wolfSSL_BIO_ctrl_pending(bio) == 0) {
|
||||
ret = WOLFSSL_CBIO_ERR_WANT_READ;
|
||||
}
|
||||
}
|
||||
|
||||
/* previous WOLFSSL_BIO in list working towards head of list */
|
||||
bio = bio->prev;
|
||||
@ -1144,7 +1151,7 @@ int wolfSSL_BIO_ctrl_reset_read_request(WOLFSSL_BIO *b)
|
||||
WOLFSSL_ENTER("wolfSSL_BIO_ctrl_reset_read_request");
|
||||
|
||||
if (b == NULL || b->type == WOLFSSL_BIO_MEMORY) {
|
||||
return SSL_FAILURE;
|
||||
return WOLFSSL_FAILURE;
|
||||
}
|
||||
|
||||
b->readRq = 0;
|
||||
@ -1194,7 +1201,7 @@ int wolfSSL_BIO_nread(WOLFSSL_BIO *bio, char **buf, int num)
|
||||
}
|
||||
|
||||
if (bio->type == WOLFSSL_BIO_MEMORY) {
|
||||
return SSL_FAILURE;
|
||||
return WOLFSSL_FAILURE;
|
||||
}
|
||||
|
||||
if (bio->pair != NULL) {
|
||||
@ -1246,7 +1253,7 @@ int wolfSSL_BIO_nwrite(WOLFSSL_BIO *bio, char **buf, int num)
|
||||
}
|
||||
|
||||
if (bio->type != WOLFSSL_BIO_BIO) {
|
||||
return SSL_FAILURE;
|
||||
return WOLFSSL_FAILURE;
|
||||
}
|
||||
|
||||
if (bio->pair != NULL) {
|
||||
@ -1414,7 +1421,7 @@ long wolfSSL_BIO_get_fp(WOLFSSL_BIO *bio, XFILE* fp)
|
||||
}
|
||||
|
||||
if (bio->type != WOLFSSL_BIO_FILE) {
|
||||
return SSL_FAILURE;
|
||||
return WOLFSSL_FAILURE;
|
||||
}
|
||||
|
||||
*fp = (XFILE)bio->ptr;
|
||||
|
@ -133,11 +133,6 @@ int BioReceive(WOLFSSL* ssl, char* buf, int sz, void* ctx)
|
||||
return WOLFSSL_CBIO_ERR_GENERAL;
|
||||
}
|
||||
|
||||
if (wolfSSL_BIO_supports_pending(ssl->biord) &&
|
||||
wolfSSL_BIO_ctrl_pending(ssl->biord) == 0) {
|
||||
WOLFSSL_MSG("BIO want read");
|
||||
return WOLFSSL_CBIO_ERR_WANT_READ;
|
||||
}
|
||||
recvd = wolfSSL_BIO_read(ssl->biord, buf, sz);
|
||||
if (recvd <= 0) {
|
||||
if (ssl->biord->type == WOLFSSL_BIO_SOCKET) {
|
||||
|
@ -3625,6 +3625,7 @@ WOLFSSL_API size_t wolfSSL_get_client_random(const WOLFSSL* ssl,
|
||||
|
||||
#if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
|
||||
WOLFSSL_API size_t wolfSSL_BIO_wpending(const WOLFSSL_BIO *bio);
|
||||
/* non-standard API to determine if BIO supports "pending" */
|
||||
WOLFSSL_API int wolfSSL_BIO_supports_pending(const WOLFSSL_BIO *bio);
|
||||
WOLFSSL_API size_t wolfSSL_BIO_ctrl_pending(WOLFSSL_BIO *b);
|
||||
|
||||
|
Reference in New Issue
Block a user