]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Fix SF #754870, SSL crash interpreter when remote side closes during connect
authorNeal Norwitz <nnorwitz@gmail.com>
Mon, 30 Jun 2003 03:25:20 +0000 (03:25 +0000)
committerNeal Norwitz <nnorwitz@gmail.com>
Mon, 30 Jun 2003 03:25:20 +0000 (03:25 +0000)
Also fix a memory leak.

Lib/test/test_socket_ssl.py
Modules/_ssl.c

index eb00b9bef1b4c7ed99d4398666ebfb78848222d9..ccb8318c47864ca5e07e56b9ce9bd28d70ee4a95 100644 (file)
@@ -2,13 +2,14 @@
 
 from test import test_support
 import socket
+import time
 
 # Optionally test SSL support.  This requires the 'network' resource as given
 # on the regrtest command line.
 skip_expected = not (test_support.is_resource_enabled('network') and
                      hasattr(socket, "ssl"))
 
-def test_main():
+def test_basic():
     test_support.requires('network')
     if not hasattr(socket, "ssl"):
         raise test_support.TestSkipped("socket module has no ssl support")
@@ -28,5 +29,40 @@ def test_main():
     buf = f.read()
     f.close()
 
+def test_rude_shutdown():
+    try:
+        import thread
+    except ImportError:
+        return
+
+    # some random port to connect to
+    PORT = 9934
+    def listener():
+        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+        s.bind(('', PORT))
+        s.listen(5)
+        s.accept()
+        del s
+        thread.exit()
+
+    def connector():
+        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+        s.connect(('', PORT))
+        try:
+            ssl_sock = socket.ssl(s)
+        except socket.sslerror:
+            pass
+        else:
+            raise test_support.TestFailed, \
+                        'connecting to closed SSL socket failed'
+
+    thread.start_new_thread(listener, ())
+    time.sleep(1)
+    connector()
+
+def test_main():
+    test_rude_shutdown()
+    test_basic()
+
 if __name__ == "__main__":
     test_main()
index 16edadd05f3dec22cce0dcc89d4e2571334e258c..27c32976623f688f501e5bf4f0503f2f102b8235 100644 (file)
@@ -110,7 +110,7 @@ PySSL_SetError(PySSLObject *obj, int ret)
        {
                unsigned long e = ERR_get_error();
                if (e == 0) {
-                       if (ret == 0) {
+                       if (ret == 0 || !obj->Socket) {
                                p = PY_SSL_ERROR_EOF;
                                errstr = "EOF occurred in violation of protocol";
                        } else if (ret == -1) {
@@ -432,6 +432,7 @@ static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args)
        timedout = wait_for_timeout(self->Socket, 0);
        if (timedout) {
                PyErr_SetString(PySSLErrorObject, "The read operation timed out");
+               Py_DECREF(buf);
                return NULL;
        }
        do {