Commit 09c35f78 authored by Martin v. Löwis's avatar Martin v. Löwis

Patch #575827: allow threads inside SSL creation.

parent 6c611fae
...@@ -186,47 +186,62 @@ newPySSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file) ...@@ -186,47 +186,62 @@ newPySSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file)
goto fail; goto fail;
} }
Py_BEGIN_ALLOW_THREADS
self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */ self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
Py_END_ALLOW_THREADS
if (self->ctx == NULL) { if (self->ctx == NULL) {
errstr = "SSL_CTX_new error"; errstr = "SSL_CTX_new error";
goto fail; goto fail;
} }
if (key_file) { if (key_file) {
if (SSL_CTX_use_PrivateKey_file(self->ctx, key_file, Py_BEGIN_ALLOW_THREADS
SSL_FILETYPE_PEM) < 1) { ret = SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
SSL_FILETYPE_PEM);
Py_END_ALLOW_THREADS
if (ret < 1) {
errstr = "SSL_CTX_use_PrivateKey_file error"; errstr = "SSL_CTX_use_PrivateKey_file error";
goto fail; goto fail;
} }
if (SSL_CTX_use_certificate_chain_file(self->ctx, Py_BEGIN_ALLOW_THREADS
cert_file) < 1) { ret = SSL_CTX_use_certificate_chain_file(self->ctx,
cert_file);
Py_END_ALLOW_THREADS
if (ret < 1) {
errstr = "SSL_CTX_use_certificate_chain_file error"; errstr = "SSL_CTX_use_certificate_chain_file error";
goto fail; goto fail;
} }
} }
Py_BEGIN_ALLOW_THREADS
SSL_CTX_set_verify(self->ctx, SSL_CTX_set_verify(self->ctx,
SSL_VERIFY_NONE, NULL); /* set verify lvl */ SSL_VERIFY_NONE, NULL); /* set verify lvl */
self->ssl = SSL_new(self->ctx); /* New ssl struct */ self->ssl = SSL_new(self->ctx); /* New ssl struct */
Py_END_ALLOW_THREADS
SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */ SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
Py_BEGIN_ALLOW_THREADS
SSL_set_connect_state(self->ssl); SSL_set_connect_state(self->ssl);
/* Actually negotiate SSL connection */ /* Actually negotiate SSL connection */
/* XXX If SSL_connect() returns 0, it's also a failure. */ /* XXX If SSL_connect() returns 0, it's also a failure. */
ret = SSL_connect(self->ssl); ret = SSL_connect(self->ssl);
Py_END_ALLOW_THREADS
if (ret <= 0) { if (ret <= 0) {
PySSL_SetError(self, ret); PySSL_SetError(self, ret);
goto fail; goto fail;
} }
self->ssl->debug = 1; self->ssl->debug = 1;
Py_BEGIN_ALLOW_THREADS
if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) { if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) {
X509_NAME_oneline(X509_get_subject_name(self->server_cert), X509_NAME_oneline(X509_get_subject_name(self->server_cert),
self->server, X509_NAME_MAXLEN); self->server, X509_NAME_MAXLEN);
X509_NAME_oneline(X509_get_issuer_name(self->server_cert), X509_NAME_oneline(X509_get_issuer_name(self->server_cert),
self->issuer, X509_NAME_MAXLEN); self->issuer, X509_NAME_MAXLEN);
} }
Py_END_ALLOW_THREADS
self->Socket = Sock; self->Socket = Sock;
Py_INCREF(self->Socket); Py_INCREF(self->Socket);
return self; return self;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment