diff options
-rw-r--r-- | doc/ssl/SSL_set_bio.pod | 13 | ||||
-rw-r--r-- | ssl/ssl.h | 2 | ||||
-rw-r--r-- | ssl/ssl_lib.c | 18 |
3 files changed, 27 insertions, 6 deletions
diff --git a/doc/ssl/SSL_set_bio.pod b/doc/ssl/SSL_set_bio.pod index 67c9756d3f..8b96ee9983 100644 --- a/doc/ssl/SSL_set_bio.pod +++ b/doc/ssl/SSL_set_bio.pod @@ -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 @@ -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); diff --git a/ssl/ssl_lib.c b/ssl/ssl_lib.c index ed987c0ff5..c535a42900 100644 --- a/ssl/ssl_lib.c +++ b/ssl/ssl_lib.c @@ -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); |