Fix BIO_eof() for BIO pairs
authorMatt Caswell <matt@openssl.org>
Mon, 9 May 2016 14:04:11 +0000 (15:04 +0100)
committerMatt Caswell <matt@openssl.org>
Mon, 9 May 2016 16:06:25 +0000 (17:06 +0100)
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>
(cherry picked from commit 3105d695358d86c0f2a404b2b74a1870b941ce5e)

crypto/bio/bss_bio.c
doc/crypto/BIO_s_bio.pod

index 4d8727f8f890cc512d625c86ee0256daa59bc9a0..202cc3615d54205ce39bcf356ea531a5240199ee 100644 (file)
@@ -655,16 +655,15 @@ static long bio_ctrl(BIO *bio, int cmd, long num, void *ptr)
         break;
 
     case BIO_CTRL_EOF:
-        {
-            BIO *other_bio = ptr;
-
-            if (other_bio) {
-                struct bio_bio_st *other_b = other_bio->ptr;
+        if (b->peer != NULL) {
+            struct bio_bio_st *peer_b = b->peer->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;
 
index 8d0a55a025c73f49a49d5d29afec0f43056b2793..9fe88b26b0af8e8f79e09401cb3e2525e014feef 100644 (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