diff -r 82ae284cd5f1 Lib/socket.py --- a/Lib/socket.py Mon Sep 03 17:29:22 2012 -0400 +++ b/Lib/socket.py Wed Sep 05 18:56:04 2012 +0100 @@ -324,12 +324,16 @@ 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 fileno(self): """Return the file descriptor of the underlying socket. diff -r 82ae284cd5f1 Lib/test/test_socket.py --- a/Lib/test/test_socket.py Mon Sep 03 17:29:22 2012 -0400 +++ b/Lib/test/test_socket.py Wed Sep 05 18:56:04 2012 +0100 @@ -1245,6 +1245,15 @@ 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") + self.assertTrue(fp.readable()) + self.assertFalse(fp.writable()) + fp.close() + self.assertRaises(ValueError, fp.readable) + self.assertRaises(ValueError, fp.writable) + def test_pickle(self): sock = socket.socket() with sock: