Skip to content

Commit

Permalink
Merged revisions 88622 via svnmerge from
Browse files Browse the repository at this point in the history
svn+ssh://pythondev@svn.python.org/python/branches/py3k

........
  r88622 | antoine.pitrou | 2011-02-26 00:07:44 +0100 (sam., 26 févr. 2011) | 5 lines

  Issue #7322: Trying to read from a socket's file-like object after a timeout
  occurred now raises an error instead of silently losing data.
  Patch by Ross Lagerwall.
........
  • Loading branch information
pitrou committed Feb 25, 2011
1 parent 7d9d34f commit 5d5381e
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 0 deletions.
6 changes: 6 additions & 0 deletions Lib/socket.py
Expand Up @@ -257,6 +257,7 @@ def __init__(self, sock, mode):
self._mode = mode
self._reading = "r" in mode
self._writing = "w" in mode
self._timeout_occurred = False

def readinto(self, b):
"""Read up to len(b) bytes into the writable buffer *b* and return
Expand All @@ -268,9 +269,14 @@ def readinto(self, b):
"""
self._checkClosed()
self._checkReadable()
if self._timeout_occurred:
raise IOError("cannot read from timed out object")
while True:
try:
return self._sock.recv_into(b)
except timeout:
self._timeout_occurred = True
raise
except error as e:
n = e.args[0]
if n == EINTR:
Expand Down
17 changes: 17 additions & 0 deletions Lib/test/test_socket.py
Expand Up @@ -1109,6 +1109,23 @@ def clientTearDown(self):
self.write_file = None
SocketConnectedTest.clientTearDown(self)

def testReadAfterTimeout(self):
# Issue #7322: A file object must disallow further reads
# after a timeout has occurred.
self.cli_conn.settimeout(1)
self.read_file.read(3)
# First read raises a timeout
self.assertRaises(socket.timeout, self.read_file.read, 1)
# Second read is disallowed
with self.assertRaises(IOError) as ctx:
self.read_file.read(1)
self.assertIn("cannot read from timed out object", str(ctx.exception))

def _testReadAfterTimeout(self):
self.write_file.write(self.write_msg[0:3])
self.write_file.flush()
self.serv_finished.wait()

def testSmallRead(self):
# Performing small file read test
first_seg = self.read_file.read(len(self.read_msg)-3)
Expand Down
3 changes: 3 additions & 0 deletions Misc/NEWS
Expand Up @@ -24,6 +24,9 @@ Core and Builtins
Library
-------

- Issue #7322: Trying to read from a socket's file-like object after a timeout
occurred now raises an error instead of silently losing data.

- Issue #10956: Buffered I/O classes retry reading or writing after a signal
has arrived and the handler returned successfully.

Expand Down

0 comments on commit 5d5381e

Please sign in to comment.