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) (cherry picked from commit 6beb8b39ba8e4cb005c1fcd2586ba19e17f04b95)
This commit is contained in:
parent
a44e1b2f20
commit
86ed78676c
1 changed files with 22 additions and 0 deletions
|
@ -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 a new issue