diff options
-rw-r--r-- | tls_bio_cb.c | 42 |
1 files changed, 26 insertions, 16 deletions
diff --git a/tls_bio_cb.c b/tls_bio_cb.c index 0091808..8adbf55 100644 --- a/tls_bio_cb.c +++ b/tls_bio_cb.c @@ -17,6 +17,7 @@ #include <fcntl.h> #include <stdlib.h> +#include <string.h> #include <unistd.h> #include <openssl/bio.h> @@ -29,19 +30,28 @@ static int bio_cb_read(BIO *bio, char *buf, int size); static int bio_cb_puts(BIO *bio, const char *str); static long bio_cb_ctrl(BIO *bio, int cmd, long num, void *ptr); -static BIO_METHOD bio_cb_method = { - .type = BIO_TYPE_MEM, - .name = "libtls_callbacks", - .bwrite = bio_cb_write, - .bread = bio_cb_read, - .bputs = bio_cb_puts, - .ctrl = bio_cb_ctrl, -}; +static BIO_METHOD *bio_cb_method; + +static pthread_once_t bio_cb_init_once = PTHREAD_ONCE_INIT; + +static void +bio_s_cb_init(void) +{ + bio_cb_method = BIO_meth_new(BIO_TYPE_MEM, "libtls_callbacks"); + if (bio_cb_method == NULL) + return; + + BIO_meth_set_write(bio_cb_method, bio_cb_write); + BIO_meth_set_read(bio_cb_method, bio_cb_read); + BIO_meth_set_puts(bio_cb_method, bio_cb_puts); + BIO_meth_set_ctrl(bio_cb_method, bio_cb_ctrl); +} static BIO_METHOD * bio_s_cb(void) { - return (&bio_cb_method); + pthread_once(&bio_cb_init_once, bio_s_cb_init); + return bio_cb_method; } static int @@ -57,10 +67,10 @@ bio_cb_ctrl(BIO *bio, int cmd, long num, void *ptr) switch (cmd) { case BIO_CTRL_GET_CLOSE: - ret = (long)bio->shutdown; + ret = (long)BIO_get_shutdown(bio); break; case BIO_CTRL_SET_CLOSE: - bio->shutdown = (int)num; + BIO_set_shutdown(bio, (int)num); break; case BIO_CTRL_DUP: case BIO_CTRL_FLUSH: @@ -69,7 +79,7 @@ bio_cb_ctrl(BIO *bio, int cmd, long num, void *ptr) case BIO_CTRL_GET: case BIO_CTRL_SET: default: - ret = BIO_ctrl(bio->next_bio, cmd, num, ptr); + ret = BIO_ctrl(BIO_next(bio), cmd, num, ptr); } return (ret); @@ -78,7 +88,7 @@ bio_cb_ctrl(BIO *bio, int cmd, long num, void *ptr) static int bio_cb_write(BIO *bio, const char *buf, int num) { - struct tls *ctx = bio->ptr; + struct tls *ctx = BIO_get_data(bio); int rv; BIO_clear_retry_flags(bio); @@ -96,7 +106,7 @@ bio_cb_write(BIO *bio, const char *buf, int num) static int bio_cb_read(BIO *bio, char *buf, int size) { - struct tls *ctx = bio->ptr; + struct tls *ctx = BIO_get_data(bio); int rv; BIO_clear_retry_flags(bio); @@ -131,8 +141,8 @@ tls_set_cbs(struct tls *ctx, tls_read_cb read_cb, tls_write_cb write_cb, tls_set_errorx(ctx, "failed to create callback i/o"); goto err; } - bio->ptr = ctx; - bio->init = 1; + BIO_set_data(bio, ctx); + BIO_set_init(bio, 1); SSL_set_bio(ctx->ssl_conn, bio, bio); |