diff -r c82e3a6553fc Lib/socket.py --- a/Lib/socket.py Fri Sep 07 08:34:23 2012 +0200 +++ b/Lib/socket.py Sun Sep 09 00:47:54 2012 +0100 @@ -324,12 +324,23 @@ def readable(self): """True if the SocketIO is open for reading. """ - return self._reading and not self.closed + if self.closed: + raise ValueError("I/O operation on closed socket.") + return self._reading def writable(self): """True if the SocketIO is open for writing. """ - return self._writing and not self.closed + if self.closed: + raise ValueError("I/O operation on closed socket.") + return self._writing + + def seekable(self): + """True if the SocketIO is open for seeking. + """ + if self.closed: + raise ValueError("I/O operation on closed socket.") + return super().seekable() def fileno(self): """Return the file descriptor of the underlying socket. diff -r c82e3a6553fc Lib/test/test_socket.py --- a/Lib/test/test_socket.py Fri Sep 07 08:34:23 2012 +0200 +++ b/Lib/test/test_socket.py Sun Sep 09 00:47:54 2012 +0100 @@ -1245,6 +1245,17 @@ fp.close() self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>") + def test_unusable_closed_socketio(self): + with socket.socket() as sock: + fp = sock.makefile("rb", buffering=0) + self.assertTrue(fp.readable()) + self.assertFalse(fp.writable()) + self.assertFalse(fp.seekable()) + fp.close() + self.assertRaises(ValueError, fp.readable) + self.assertRaises(ValueError, fp.writable) + self.assertRaises(ValueError, fp.seekable) + def test_pickle(self): sock = socket.socket() with sock: