Index: Lib/socket.py =================================================================== --- Lib/socket.py (révision 68329) +++ Lib/socket.py (copie de travail) @@ -225,6 +225,8 @@ return self._writing and not self.closed def fileno(self): + if self.closed: + raise error("I/O operation on closed socket") return self._sock.fileno() @property @@ -239,9 +241,11 @@ if self.closed: return io.RawIOBase.close(self) + self._sock._decref_socketios() def __del__(self): - self._sock._decref_socketios() + if not self.closed: + self._sock._decref_socketios() def getfqdn(name=''): Index: Lib/test/test_socket.py =================================================================== --- Lib/test/test_socket.py (révision 68329) +++ Lib/test/test_socket.py (copie de travail) @@ -856,6 +856,15 @@ self.assertEqual(self.cli_file.mode, 'wb') self.assertEqual(self.cli_file.name, self.serv_conn.fileno()) + def testRealClose(self): + self.serv_file.close() + self.assertRaises(socket.error, self.serv_file.fileno) + self.cli_conn.close() + self.assertRaises(socket.error, self.cli_conn.fileno) + + def _testRealClose(self): + pass + class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase): """Repeat the tests from FileObjectClassTestCase with bufsize==0. Index: Modules/socketmodule.c =================================================================== --- Modules/socketmodule.c (révision 68329) +++ Modules/socketmodule.c (copie de travail) @@ -2007,6 +2007,10 @@ static PyObject * sock_fileno(PySocketSockObject *s) { + if (s->sock_fd < 0) { + PyErr_SetString(socket_error, "I/O operation on closed socket"); + return NULL; + } return PyLong_FromSocket_t(s->sock_fd); }