Fixed BIO_METHOD initialization for thread safety.

This commit is contained in:
Vincent Richard 2013-05-12 16:09:17 +02:00
parent 845b9ebf81
commit 64f6f5c594
2 changed files with 18 additions and 14 deletions

View File

@ -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> TLSSocket::wrap(ref <TLSSession> session, ref <socket> 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());

View File

@ -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);