Apache Traffic Server has a need to set the rbio without touching the wbio.
authorMatt Caswell <matt@openssl.org>
Sat, 7 Feb 2015 00:08:59 +0000 (00:08 +0000)
committerMatt Caswell <matt@openssl.org>
Sat, 7 Feb 2015 14:29:16 +0000 (14:29 +0000)
There is no mechanism to do that at the moment - SSL_set_bio makes changes
to the wbio even if you pass in SSL_get_wbio().

This commit introduces two new API functions SSL_set_rbio() and
SSL_set_wbio(). These do the same job as SSL_set_bio() except they enable
you to manage the rbio and wbio individually.

Reviewed-by: Tim Hudson <tjh@openssl.org>
doc/ssl/SSL_set_bio.pod
ssl/ssl.h
ssl/ssl_lib.c

index 67c9756d3fe5ee77a1b9d1ae89592890c0c12482..8b96ee9983fc634fd7d85d86dcd7b5b6346e561b 100644 (file)
@@ -2,7 +2,7 @@
 
 =head1 NAME
 
-SSL_set_bio - connect the SSL object with a BIO
+SSL_set_bio, SSL_set_rbio, SSL_set_wbio - connect the SSL object with a BIO
 
 =head1 SYNOPSIS
 
@@ -21,9 +21,14 @@ If a BIO is non-blocking, the B<ssl> will also have non-blocking behaviour.
 If there was already a BIO connected to B<ssl>, BIO_free() will be called
 (for both the reading and writing side, if different).
 
+SSL_set_rbio() does the same job as SSL_set_bio() except that it enables you
+to only connect the read bio, without touching the write bio. Similarly
+SSL_set_wbio() enables you to connect the write bio without touching the read
+bio.
+
 =head1 RETURN VALUES
 
-SSL_set_bio() cannot fail.
+SSL_set_bio(), SSL_set_rbio() and SSL_set_wbio() cannot fail.
 
 =head1 SEE ALSO
 
@@ -31,4 +36,8 @@ L<SSL_get_rbio(3)|SSL_get_rbio(3)>,
 L<SSL_connect(3)|SSL_connect(3)>, L<SSL_accept(3)|SSL_accept(3)>,
 L<SSL_shutdown(3)|SSL_shutdown(3)>, L<ssl(3)|ssl(3)>, L<bio(3)|bio(3)>
 
+=head1 HISTORY
+
+SSL_set_rbio() and SSL_set_wbio() were added in OpenSSL 1.1.0.
+
 =cut
index 8eed2caa54521d70ff92bc412ec0adfba88f9d44..564b75ec88302681d97e7736fd1ae729f1210a75 100644 (file)
--- a/ssl/ssl.h
+++ b/ssl/ssl.h
@@ -1398,6 +1398,8 @@ int SSL_set_fd(SSL *s, int fd);
 int SSL_set_rfd(SSL *s, int fd);
 int SSL_set_wfd(SSL *s, int fd);
 # endif
+void SSL_set_rbio(SSL *s, BIO *rbio);
+void SSL_set_wbio(SSL *s, BIO *wbio);
 void SSL_set_bio(SSL *s, BIO *rbio, BIO *wbio);
 BIO *SSL_get_rbio(const SSL *s);
 BIO *SSL_get_wbio(const SSL *s);
index ed987c0ff5deefd2f04deee3ef956421c8f6564a..c535a42900c0b854d588c0b7343a44543251dc73 100644 (file)
@@ -622,7 +622,14 @@ void SSL_free(SSL *s)
     OPENSSL_free(s);
 }
 
-void SSL_set_bio(SSL *s, BIO *rbio, BIO *wbio)
+void SSL_set_rbio(SSL *s, BIO *rbio)
+{
+    if ((s->rbio != NULL) && (s->rbio != rbio))
+        BIO_free_all(s->rbio);
+    s->rbio = rbio;
+}
+
+void SSL_set_wbio(SSL *s, BIO *wbio)
 {
     /*
      * If the output buffering BIO is still in place, remove it
@@ -633,14 +640,17 @@ void SSL_set_bio(SSL *s, BIO *rbio, BIO *wbio)
             s->bbio->next_bio = NULL;
         }
     }
-    if ((s->rbio != NULL) && (s->rbio != rbio))
-        BIO_free_all(s->rbio);
     if ((s->wbio != NULL) && (s->wbio != wbio) && (s->rbio != s->wbio))
         BIO_free_all(s->wbio);
-    s->rbio = rbio;
     s->wbio = wbio;
 }
 
+void SSL_set_bio(SSL *s, BIO *rbio, BIO *wbio)
+{
+    SSL_set_wbio(s, wbio);
+    SSL_set_rbio(s, rbio);
+}
+
 BIO *SSL_get_rbio(const SSL *s)
 {
     return (s->rbio);