Commit 7ef909cd authored by Richard Oudkerk's avatar Richard Oudkerk

Fix for issue 14725 for 3.2 branch

parent 16f6f833
...@@ -360,7 +360,10 @@ if sys.platform == 'win32': ...@@ -360,7 +360,10 @@ if sys.platform == 'win32':
try: try:
win32.ConnectNamedPipe(handle, win32.NULL) win32.ConnectNamedPipe(handle, win32.NULL)
except WindowsError as e: except WindowsError as e:
if e.args[0] != win32.ERROR_PIPE_CONNECTED: # ERROR_NO_DATA can occur if a client has already connected,
# written data and then disconnected -- see Issue 14725.
if e.args[0] not in (win32.ERROR_PIPE_CONNECTED,
win32.ERROR_NO_DATA):
raise raise
return _multiprocessing.PipeConnection(handle) return _multiprocessing.PipeConnection(handle)
......
...@@ -1732,6 +1732,23 @@ class _TestListenerClient(BaseTestCase): ...@@ -1732,6 +1732,23 @@ class _TestListenerClient(BaseTestCase):
self.assertEqual(conn.recv(), 'hello') self.assertEqual(conn.recv(), 'hello')
p.join() p.join()
l.close() l.close()
def test_issue14725(self):
l = self.connection.Listener()
p = self.Process(target=self._test, args=(l.address,))
p.daemon = True
p.start()
time.sleep(1)
# On Windows the client process should by now have connected,
# written data and closed the pipe handle by now. This causes
# ConnectNamdedPipe() to fail with ERROR_NO_DATA. See Issue
# 14725.
conn = l.accept()
self.assertEqual(conn.recv(), 'hello')
conn.close()
p.join()
l.close()
# #
# Test of sending connection and socket objects between processes # Test of sending connection and socket objects between processes
# #
......
...@@ -244,6 +244,7 @@ create_win32_namespace(void) ...@@ -244,6 +244,7 @@ create_win32_namespace(void)
Py_INCREF(&Win32Type); Py_INCREF(&Win32Type);
WIN32_CONSTANT(F_DWORD, ERROR_ALREADY_EXISTS); WIN32_CONSTANT(F_DWORD, ERROR_ALREADY_EXISTS);
WIN32_CONSTANT(F_DWORD, ERROR_NO_DATA);
WIN32_CONSTANT(F_DWORD, ERROR_PIPE_BUSY); WIN32_CONSTANT(F_DWORD, ERROR_PIPE_BUSY);
WIN32_CONSTANT(F_DWORD, ERROR_PIPE_CONNECTED); WIN32_CONSTANT(F_DWORD, ERROR_PIPE_CONNECTED);
WIN32_CONSTANT(F_DWORD, ERROR_SEM_TIMEOUT); WIN32_CONSTANT(F_DWORD, ERROR_SEM_TIMEOUT);
......
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