Issue #26685: Raise OSError if closing a socket fails
diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst
index c09927c..cd6e310 100644
--- 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
index 9be1a9c..8bf2847 100644
--- 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
index ef5e99e..15f88e4 100644
--- 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
index 02bc0c0..982a976 100644
--- 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
index f7694cc..7ac9b34 100644
--- 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
index 8df735d..bcff004 100644
--- 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;