From: Matt Caswell Date: Sat, 7 Feb 2015 00:08:59 +0000 (+0000) Subject: Apache Traffic Server has a need to set the rbio without touching the wbio. X-Git-Tag: OpenSSL_1_1_0-pre1~1679 X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff_plain;h=3ffbe008083dcaad282622e8e4be69bb29bc6315 Apache Traffic Server has a need to set the rbio without touching the wbio. 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 --- 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 will also have non-blocking behaviour. If there was already a BIO connected to B, 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, L, L, L, L, L +=head1 HISTORY + +SSL_set_rbio() and SSL_set_wbio() were added in OpenSSL 1.1.0. + =cut diff --git a/ssl/ssl.h b/ssl/ssl.h index 8eed2caa54..564b75ec88 100644 --- 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); 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);