Fix SF #754870, SSL crash interpreter when remote side closes during connect

Also fix a memory leak.
This commit is contained in:
Neal Norwitz 2003-06-30 03:25:20 +00:00
parent b346096b65
commit a9002f824b
2 changed files with 39 additions and 2 deletions

View 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()

View 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 {