[Python-checkins] cpython: Issue #26685: Raise OSError if closing a socket fails

martin.panter python-checkins at python.org
Sun Apr 10 21:20:25 EDT 2016


https://hg.python.org/cpython/rev/bd665613ed67
changeset:   100911:bd665613ed67
user:        Martin Panter <vadmium+py at gmail.com>
date:        Mon Apr 11 00:38:12 2016 +0000
summary:
  Issue #26685: Raise OSError if closing a socket fails

files:
  Doc/library/socket.rst  |   4 ++++
  Doc/whatsnew/3.6.rst    |   4 ++++
  Lib/test/test_pty.py    |   1 -
  Lib/test/test_socket.py |  11 +++++++++++
  Misc/NEWS               |   2 ++
  Modules/socketmodule.c  |   6 +++++-
  6 files changed, 26 insertions(+), 2 deletions(-)


diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst
--- a/Doc/library/socket.rst
+++ b/Doc/library/socket.rst
@@ -868,6 +868,10 @@
    it is recommended to :meth:`close` them explicitly, or to use a
    :keyword:`with` statement around them.
 
+   .. versionchanged:: 3.6
+      :exc:`OSError` is now raised if an error occurs when the underlying
+      :c:func:`close` call is made.
+
    .. note::
 
       :meth:`close()` releases the resource associated with a connection but
diff --git a/Doc/whatsnew/3.6.rst b/Doc/whatsnew/3.6.rst
--- a/Doc/whatsnew/3.6.rst
+++ b/Doc/whatsnew/3.6.rst
@@ -514,6 +514,10 @@
 * :func:`spwd.getspnam` now raises a :exc:`PermissionError` instead of
   :exc:`KeyError` if the user doesn't have privileges.
 
+* The :meth:`socket.socket.close` method now raises an exception if
+  an error (e.g. EBADF) was reported by the underlying system call.
+  See :issue:`26685`.
+
 Changes in the C API
 --------------------
 
diff --git a/Lib/test/test_pty.py b/Lib/test/test_pty.py
--- a/Lib/test/test_pty.py
+++ b/Lib/test/test_pty.py
@@ -277,7 +277,6 @@
         socketpair = self._socketpair()
         masters = [s.fileno() for s in socketpair]
 
-        os.close(masters[1])
         socketpair[1].close()
         os.close(write_to_stdin_fd)
 
diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py
--- a/Lib/test/test_socket.py
+++ b/Lib/test/test_socket.py
@@ -1161,6 +1161,17 @@
         sock.close()
         self.assertRaises(OSError, sock.send, b"spam")
 
+    def testCloseException(self):
+        sock = socket.socket()
+        socket.socket(fileno=sock.fileno()).close()
+        try:
+            sock.close()
+        except OSError as err:
+            # Winsock apparently raises ENOTSOCK
+            self.assertIn(err.errno, (errno.EBADF, errno.ENOTSOCK))
+        else:
+            self.fail("close() should raise EBADF/ENOTSOCK")
+
     def testNewAttributes(self):
         # testing .family, .type and .protocol
 
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -240,6 +240,8 @@
 Library
 -------
 
+- Issue #26685: Raise OSError if closing a socket fails.
+
 - Issue #16329: Add .webm to mimetypes.types_map.  Patch by Giampaolo Rodola'.
 
 - Issue #13952: Add .csv to mimetypes.types_map.  Patch by Geoff Wilson.
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -2576,6 +2576,7 @@
 sock_close(PySocketSockObject *s)
 {
     SOCKET_T fd;
+    int res;
 
     fd = s->sock_fd;
     if (fd != -1) {
@@ -2586,8 +2587,11 @@
            http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
            for more details. */
         Py_BEGIN_ALLOW_THREADS
-        (void) SOCKETCLOSE(fd);
+        res = SOCKETCLOSE(fd);
         Py_END_ALLOW_THREADS
+        if (res < 0) {
+            return s->errorhandler();
+        }
     }
     Py_INCREF(Py_None);
     return Py_None;

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list