From 64f6f5c594cd52b6e9e0418b4cfb5878fa297779 Mon Sep 17 00:00:00 2001 From: Vincent Richard Date: Sun, 12 May 2013 16:09:17 +0200 Subject: [PATCH] Fixed BIO_METHOD initialization for thread safety. --- src/net/tls/openssl/TLSSocket_OpenSSL.cpp | 30 +++++++++++---------- vmime/net/tls/openssl/TLSSocket_OpenSSL.hpp | 2 ++ 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/net/tls/openssl/TLSSocket_OpenSSL.cpp b/src/net/tls/openssl/TLSSocket_OpenSSL.cpp index e62312d6..b8ac18e9 100644 --- a/src/net/tls/openssl/TLSSocket_OpenSSL.cpp +++ b/src/net/tls/openssl/TLSSocket_OpenSSL.cpp @@ -45,6 +45,21 @@ namespace net { namespace tls { +// static +BIO_METHOD TLSSocket_OpenSSL::sm_customBIOMethod = +{ + 100 | BIO_TYPE_SOURCE_SINK, + "vmime::socket glue", + TLSSocket_OpenSSL::bio_write, + TLSSocket_OpenSSL::bio_read, + TLSSocket_OpenSSL::bio_puts, + TLSSocket_OpenSSL::bio_gets, + TLSSocket_OpenSSL::bio_ctrl, + TLSSocket_OpenSSL::bio_create, + TLSSocket_OpenSSL::bio_destroy +}; + + // static ref TLSSocket::wrap(ref session, ref sok) { @@ -82,20 +97,7 @@ void TLSSocket_OpenSSL::createSSLHandle() { if (m_wrapped->isConnected()) { - static BIO_METHOD customBIOMethod; - ::memset(&customBIOMethod, 0, sizeof(customBIOMethod)); - - customBIOMethod.type = 100 | BIO_TYPE_SOURCE_SINK; - customBIOMethod.name = "vmime::socket glue"; - customBIOMethod.bwrite = bio_write; - customBIOMethod.bread = bio_read; - customBIOMethod.bputs = bio_puts; - customBIOMethod.bgets = bio_gets; - customBIOMethod.ctrl = bio_ctrl; - customBIOMethod.create = bio_create; - customBIOMethod.destroy = bio_destroy; - - BIO* sockBio = BIO_new(&customBIOMethod); + BIO* sockBio = BIO_new(&sm_customBIOMethod); sockBio->ptr = this; m_ssl = SSL_new(m_session->getContext()); diff --git a/vmime/net/tls/openssl/TLSSocket_OpenSSL.hpp b/vmime/net/tls/openssl/TLSSocket_OpenSSL.hpp index b8f9e34b..5bf27804 100644 --- a/vmime/net/tls/openssl/TLSSocket_OpenSSL.hpp +++ b/vmime/net/tls/openssl/TLSSocket_OpenSSL.hpp @@ -85,6 +85,8 @@ public: private: + static BIO_METHOD sm_customBIOMethod; + static int bio_write(BIO* bio, const char* buf, int len); static int bio_read(BIO* bio, char* buf, int len); static int bio_puts(BIO* bio, const char* str);