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:
Tomas Mraz 2019-09-12 12:27:36 +02:00
parent 799614faa3
commit 6beb8b39ba

View File

@ -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;