summaryrefslogtreecommitdiffstats
path: root/ssl
diff options
context:
space:
mode:
authorMatt Caswell <matt@openssl.org>2015-02-07 00:08:59 +0000
committerMatt Caswell <matt@openssl.org>2015-02-07 14:29:16 +0000
commit3ffbe008083dcaad282622e8e4be69bb29bc6315 (patch)
tree5b0daabb913aec51589bd67987a1ec1f278d522b /ssl
parent05c3234ddfb41f4fdaae1162de3b825d741da828 (diff)
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 <tjh@openssl.org>
Diffstat (limited to 'ssl')
-rw-r--r--ssl/ssl.h2
-rw-r--r--ssl/ssl_lib.c18
2 files changed, 16 insertions, 4 deletions
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);