mirror of
https://github.com/openssl/openssl.git
synced 2024-12-03 05:41:46 +08:00
BIO_f_zlib: Properly handle BIO_CTRL_PENDING and BIO_CTRL_WPENDING calls.
There can be data to write in output buffer and data to read that were not yet read in the input stream. Fixes #9866 Reviewed-by: Richard Levitte <levitte@openssl.org> (Merged from https://github.com/openssl/openssl/pull/9877)
This commit is contained in:
parent
799614faa3
commit
6beb8b39ba
@ -598,6 +598,28 @@ static long bio_zlib_ctrl(BIO *b, int cmd, long num, void *ptr)
|
||||
BIO_copy_next_retry(b);
|
||||
break;
|
||||
|
||||
case BIO_CTRL_WPENDING:
|
||||
if (ctx->obuf == NULL)
|
||||
return 0;
|
||||
|
||||
if (ctx->odone) {
|
||||
ret = ctx->ocount;
|
||||
} else {
|
||||
ret = ctx->ocount;
|
||||
if (ret == 0)
|
||||
/* Unknown amount pending but we are not finished */
|
||||
ret = 1;
|
||||
}
|
||||
if (ret == 0)
|
||||
ret = BIO_ctrl(next, cmd, num, ptr);
|
||||
break;
|
||||
|
||||
case BIO_CTRL_PENDING:
|
||||
ret = ctx->zin.avail_in;
|
||||
if (ret == 0)
|
||||
ret = BIO_ctrl(next, cmd, num, ptr);
|
||||
break;
|
||||
|
||||
default:
|
||||
ret = BIO_ctrl(next, cmd, num, ptr);
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user