Fix BIO_eof() for BIO pairs

BIO_eof() was always returning true when using a BIO pair. It should only
be true if the peer BIO is empty and has been shutdown.

RT#1215

Reviewed-by: Richard Levitte <levitte@openssl.org>
This commit is contained in:
Matt Caswell 2016-05-09 15:04:11 +01:00
parent 2e66d3d674
commit 3105d69535
2 changed files with 10 additions and 8 deletions

View File

@ -627,16 +627,15 @@ static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr)
break;
case BIO_CTRL_EOF:
{
BIO *other_bio = ptr;
if (b->peer != NULL) {
struct bio_bio_st *peer_b = b->peer->ptr;
if (other_bio) {
struct bio_bio_st *other_b = other_bio->ptr;
assert(other_b != NULL);
ret = other_b->len == 0 && other_b->closed;
} else
if (peer_b->len == 0 && peer_b->closed)
ret = 1;
else
ret = 0;
} else {
ret = 1;
}
break;

View File

@ -120,6 +120,9 @@ the application then waits for data to be available on the underlying transport
before flushing the write buffer it will never succeed because the request was
never sent!
BIO_eof() is true if no data is in the peer BIO and the peer BIO has been
shutdown.
=head1 RETURN VALUES
BIO_new_bio_pair() returns 1 on success, with the new BIOs available in