diff -r 574db664e364 Lib/socket.py --- a/Lib/socket.py Thu Jan 13 22:58:44 2011 +0100 +++ b/Lib/socket.py Fri Jan 14 07:19:13 2011 +0200 @@ -257,6 +257,7 @@ 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 @@ -266,11 +267,16 @@ If *b* is non-empty, a 0 return value indicates that the connection was shutdown at the other end. """ + if self._timeout_occurred: + raise IOError("cannot read from timed out object") self._checkClosed() self._checkReadable() while True: try: return self._sock.recv_into(b) + except _socket.timeout as e: + self._timeout_occurred = True + raise except error as e: n = e.args[0] if n == EINTR: diff -r 574db664e364 Lib/test/test_socket.py --- a/Lib/test/test_socket.py Thu Jan 13 22:58:44 2011 +0100 +++ b/Lib/test/test_socket.py Fri Jan 14 07:19:13 2011 +0200 @@ -1109,6 +1109,23 @@ self.write_file = None SocketConnectedTest.clientTearDown(self) + def test7322(self): + # Issue 7322: A file object must disallow further reads + # after a timeout has occurred. + self.cli_conn.settimeout(1) + self.read_file.read(2) + self.read_file.read(1) + try: + print(self.read_file.read(1)) + except socket.timeout as e: + pass + self.assertRaises(IOError, self.read_file.read, 1) + + def _test7322(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)