summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Antonuk <alan.antonuk@gmail.com>2017-09-13 23:23:57 -0700
committerSimon Giesecke <simon.giesecke@btc-ag.com>2018-03-12 17:02:46 +0100
commitef8c3b9d2bbe99c6c279554e86e460cf3fbe7ed3 (patch)
treeaf13f31202dc6a79d33c66079d651807e0102407
parent125ece47e70c48abf66d5438829957e5b331a7fc (diff)
downloadrabbitmq-c-ef8c3b9d2bbe99c6c279554e86e460cf3fbe7ed3.tar.gz
Lib: Support OpenSSL v1.1.0 in amqp_openssl_bio
-rw-r--r--librabbitmq/amqp_openssl.c8
-rw-r--r--librabbitmq/amqp_openssl_bio.c55
-rw-r--r--librabbitmq/amqp_openssl_bio.h4
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);