[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