diff --git a/src/internal.c b/src/internal.c index 0ffaae6c4..230039540 100644 --- a/src/internal.c +++ b/src/internal.c @@ -1382,6 +1382,7 @@ int InitSSL_Ctx(WOLFSSL_CTX* ctx, WOLFSSL_METHOD* method, void* heap) #endif #ifdef OPENSSL_EXTRA ctx->verifyDepth = MAX_CHAIN_DEPTH; + ctx->cbioFlag = WOLFSSL_CBIO_NONE; #endif #ifndef WOLFSSL_USER_IO @@ -4645,6 +4646,7 @@ int InitSSL(WOLFSSL* ssl, WOLFSSL_CTX* ctx, int writeDup) /* copy over application session context ID */ ssl->sessionCtxSz = ctx->sessionCtxSz; XMEMCPY(ssl->sessionCtx, ctx->sessionCtx, ctx->sessionCtxSz); + ssl->cbioFlag = ctx->cbioFlag; #endif InitCiphers(ssl); diff --git a/src/ssl.c b/src/ssl.c index 0cf526e5c..7ff740783 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -11116,10 +11116,12 @@ int wolfSSL_set_compression(WOLFSSL* ssl) ssl->biowr = wr; /* set SSL to use BIO callbacks instead */ - if (rd != NULL && rd->type != WOLFSSL_BIO_SOCKET) { + if (((ssl->cbioFlag & WOLFSSL_CBIO_RECV) == 0) && + (rd != NULL && rd->type != WOLFSSL_BIO_SOCKET)) { ssl->CBIORecv = BioReceive; } - if (wr != NULL && wr->type != WOLFSSL_BIO_SOCKET) { + if (((ssl->cbioFlag & WOLFSSL_CBIO_SEND) == 0) && + (wr != NULL && wr->type != WOLFSSL_BIO_SOCKET)) { ssl->CBIOSend = BioSend; } } diff --git a/src/wolfio.c b/src/wolfio.c index 344b12f8b..da6683e5e 100644 --- a/src/wolfio.c +++ b/src/wolfio.c @@ -1433,12 +1433,18 @@ int EmbedCrlLookup(WOLFSSL_CRL* crl, const char* url, int urlSz) WOLFSSL_API void wolfSSL_CTX_SetIORecv(WOLFSSL_CTX *ctx, CallbackIORecv CBIORecv) { ctx->CBIORecv = CBIORecv; + #ifdef OPENSSL_EXTRA + ctx->cbioFlag |= WOLFSSL_CBIO_RECV; + #endif } WOLFSSL_API void wolfSSL_CTX_SetIOSend(WOLFSSL_CTX *ctx, CallbackIOSend CBIOSend) { ctx->CBIOSend = CBIOSend; + #ifdef OPENSSL_EXTRA + ctx->cbioFlag |= WOLFSSL_CBIO_SEND; + #endif } diff --git a/wolfssl/internal.h b/wolfssl/internal.h index 5734170c7..ab96ac799 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -2414,6 +2414,14 @@ enum KeyUpdateRequest { #endif /* WOLFSSL_TLS13 */ +#ifdef OPENSSL_EXTRA +enum SetCBIO { + WOLFSSL_CBIO_NONE = 0, + WOLFSSL_CBIO_RECV = 0x1, + WOLFSSL_CBIO_SEND = 0x2, +}; +#endif + /* wolfSSL context type */ struct WOLFSSL_CTX { WOLFSSL_METHOD* method; @@ -2507,6 +2515,7 @@ struct WOLFSSL_CTX { const unsigned char *alpn_cli_protos;/* ALPN client protocol list */ unsigned int alpn_cli_protos_len; byte sessionCtxSz; + byte cbioFlag; /* WOLFSSL_CBIO_RECV/SEND: CBIORecv/Send is set */ CallbackInfoState* CBIS; /* used to get info about SSL state */ #endif CallbackIORecv CBIORecv; @@ -2652,7 +2661,6 @@ struct WOLFSSL_CTX { #endif }; - WOLFSSL_LOCAL WOLFSSL_CTX* wolfSSL_CTX_new_ex(WOLFSSL_METHOD* method, void* heap); WOLFSSL_LOCAL @@ -3542,6 +3550,9 @@ struct WOLFSSL { WriteDup* dupWrite; /* valid pointer indicates ON */ /* side that decrements dupCount to zero frees overall structure */ byte dupSide; /* write side or read side */ +#endif +#ifdef OPENSSL_EXTRA + byte cbioFlag; /* WOLFSSL_CBIO_RECV/SEND: CBIORecv/Send is set */ #endif CallbackIORecv CBIORecv; CallbackIOSend CBIOSend;