bpo-30594: Fixed refcounting in newPySSLSocket (#1992)
authorNathaniel J. Smith <njs@pobox.com>
Thu, 8 Jun 2017 06:30:43 +0000 (23:30 -0700)
committerSerhiy Storchaka <storchaka@gmail.com>
Thu, 8 Jun 2017 06:30:43 +0000 (09:30 +0300)
If pass a server_hostname= that fails IDNA decoding to SSLContext.wrap_socket or SSLContext.wrap_bio, then the SSLContext object had a spurious Py_DECREF called on it, eventually leading to segfaults.

Modules/_ssl.c

index 147703c11e350ae8f2f9ed1cf1951d7a677150eb..d318b252e83058a68a9fbb3375a0e73d09dec083 100644 (file)
@@ -596,6 +596,7 @@ newPySSLSocket(PySSLContext *sslctx, PySocketSockObject *sock,
     self->ssl = NULL;
     self->Socket = NULL;
     self->ctx = sslctx;
+    Py_INCREF(sslctx);
     self->shutdown_seen_zero = 0;
     self->owner = NULL;
     self->server_hostname = NULL;
@@ -609,8 +610,6 @@ newPySSLSocket(PySSLContext *sslctx, PySocketSockObject *sock,
         self->server_hostname = hostname;
     }
 
-    Py_INCREF(sslctx);
-
     /* Make sure the SSL error state is initialized */
     (void) ERR_get_state();
     ERR_clear_error();