diff options
author | Alan Antonuk <alan.antonuk@gmail.com> | 2017-09-13 23:23:57 -0700 |
---|---|---|
committer | Simon Giesecke <simon.giesecke@btc-ag.com> | 2018-03-12 17:02:46 +0100 |
commit | ef8c3b9d2bbe99c6c279554e86e460cf3fbe7ed3 (patch) | |
tree | af13f31202dc6a79d33c66079d651807e0102407 | |
parent | 125ece47e70c48abf66d5438829957e5b331a7fc (diff) | |
download | rabbitmq-c-ef8c3b9d2bbe99c6c279554e86e460cf3fbe7ed3.tar.gz |
Lib: Support OpenSSL v1.1.0 in amqp_openssl_bio
-rw-r--r-- | librabbitmq/amqp_openssl.c | 8 | ||||
-rw-r--r-- | librabbitmq/amqp_openssl_bio.c | 55 | ||||
-rw-r--r-- | librabbitmq/amqp_openssl_bio.h | 4 |
3 files changed, 57 insertions, 10 deletions
diff --git a/librabbitmq/amqp_openssl.c b/librabbitmq/amqp_openssl.c index 7902272..e9f71f2 100644 --- a/librabbitmq/amqp_openssl.c +++ b/librabbitmq/amqp_openssl.c @@ -623,7 +623,10 @@ static int initialize_ssl_and_increment_connections() { } if (!openssl_bio_initialized) { - amqp_openssl_bio_init(); + status = amqp_openssl_bio_init(); + if (status) { + goto exit; + } openssl_bio_initialized = 1; } @@ -654,6 +657,9 @@ int amqp_uninitialize_ssl_library(void) { goto out; } + amqp_openssl_bio_destroy(); + openssl_bio_initialized = 0; + ERR_remove_state(0); FIPS_mode_set(0); diff --git a/librabbitmq/amqp_openssl_bio.c b/librabbitmq/amqp_openssl_bio.c index b0f4aad..91a46bb 100644 --- a/librabbitmq/amqp_openssl_bio.c +++ b/librabbitmq/amqp_openssl_bio.c @@ -43,7 +43,12 @@ static int amqp_ssl_bio_initialized = 0; #ifdef AMQP_USE_AMQP_BIO -static BIO_METHOD amqp_bio_method; + +#if (OPENSSL_VERSION_NUMBER > 0x10100000L) +#define AMQP_OPENSSL_V110 +#endif + +static BIO_METHOD *amqp_bio_method; static int amqp_openssl_bio_should_retry(int res) { if (res == -1) { @@ -120,7 +125,7 @@ static int amqp_openssl_bio_read(BIO *b, char *out, int outl) { return res; } -#if (OPENSSL_VERSION_NUMBER < 0x10100000L) +#ifndef AMQP_OPENSSL_V110 static int BIO_meth_set_write(BIO_METHOD *biom, int (*wfn)(BIO *, const char *, int)) { biom->bwrite = wfn; @@ -131,24 +136,58 @@ static int BIO_meth_set_read(BIO_METHOD *biom, int (*rfn)(BIO *, char *, int)) { biom->bread = rfn; return 0; } -#endif /* OPENSSL_VERSION_NUMBER < 0x10100000L */ +#endif /* AQP_OPENSSL_V110 */ #endif /* AMQP_USE_AMQP_BIO */ -void amqp_openssl_bio_init(void) { +int amqp_openssl_bio_init(void) { assert(!amqp_ssl_bio_initialized); #ifdef AMQP_USE_AMQP_BIO - memcpy(&amqp_bio_method, BIO_s_socket(), sizeof(amqp_bio_method)); - BIO_meth_set_write(&amqp_bio_method, amqp_openssl_bio_write); - BIO_meth_set_read(&amqp_bio_method, amqp_openssl_bio_read); +#ifdef AMQP_OPENSSL_V110 + if (!(amqp_bio_method = BIO_meth_new(BIO_TYPE_SOCKET, "amqp_bio_method"))) { + return AMQP_STATUS_NO_MEMORY; + } + + BIO_METHOD *meth = BIO_s_socket(); + BIO_meth_set_create(amqp_bio_method, BIO_meth_get_create(meth)); + BIO_meth_set_destroy(amqp_bio_method, BIO_meth_get_destroy(meth)); + BIO_meth_set_ctrl(amqp_bio_method, BIO_meth_get_ctrl(meth)); + BIO_meth_set_callback_ctrl(amqp_bio_method, BIO_meth_get_callback_ctrl(meth)); + BIO_meth_set_read(amqp_bio_method, BIO_meth_get_read(meth)); + BIO_meth_set_write(amqp_bio_method, BIO_meth_get_write(meth)); + BIO_meth_set_gets(amqp_bio_method, BIO_meth_get_gets(meth)); + BIO_meth_set_puts(amqp_bio_method, BIO_meth_get_puts(meth)); +#else + if (!(amqp_bio_method = OPENSSL_malloc(sizeof(BIO_METHOD)))) { + return AMQP_STATUS_NO_MEMORY; + } + + memcpy(amqp_bio_method, BIO_s_socket(), sizeof(BIO_METHOD)); +#endif + BIO_meth_set_write(amqp_bio_method, amqp_openssl_bio_write); + BIO_meth_set_read(amqp_bio_method, amqp_openssl_bio_read); #endif amqp_ssl_bio_initialized = 1; + return AMQP_STATUS_OK; +} + +void amqp_openssl_bio_destroy(void) { + assert(amqp_ssl_bio_initialized); +#ifdef AMQP_USE_AMQP_BIO +#ifdef AMQP_OPENSSL_V110 + BIO_meth_free(amqp_bio_method); +#else + OPENSSL_free(amqp_bio_method); +#endif + amqp_bio_method = NULL; +#endif + amqp_ssl_bio_initialized = 0; } BIO_METHOD *amqp_openssl_bio(void) { assert(amqp_ssl_bio_initialized); #ifdef AMQP_USE_AMQP_BIO - return &amqp_bio_method; + return amqp_bio_method; #else return BIO_s_socket(); #endif diff --git a/librabbitmq/amqp_openssl_bio.h b/librabbitmq/amqp_openssl_bio.h index 68be2de..9c99c78 100644 --- a/librabbitmq/amqp_openssl_bio.h +++ b/librabbitmq/amqp_openssl_bio.h @@ -25,7 +25,9 @@ #include <openssl/bio.h> -void amqp_openssl_bio_init(void); +int amqp_openssl_bio_init(void); + +void amqp_openssl_bio_destroy(void); BIO_METHOD* amqp_openssl_bio(void); |