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:05:16 +0000 (17:05 +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>
crypto/bio/bss_bio.c
doc/crypto/BIO_s_bio.pod

index 2991c3afedcb01326078deba3d2ea5d69e9f291e..820cf8cf6a25982366004e138fa86d19e44f78de 100644 (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 (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 438b5dd8f3a5a70dab7003f6cb2e1181d58b0f2c..e6d5c4967c7f51d682e87903401338332ba3831b 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