Issue #28471: Fix crash (GIL state related) in socket.setblocking
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
index d25bd7f..f53eade 100644
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -622,6 +622,7 @@
 static int
 internal_setblocking(PySocketSockObject *s, int block)
 {
+    int result = -1;
 #ifdef MS_WINDOWS
     u_long arg;
 #endif
@@ -641,34 +642,39 @@
 #if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
     block = !block;
     if (ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block) == -1)
-        goto error;
+        goto done;
 #else
     delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
     if (delay_flag == -1)
-        goto error;
+        goto done;
     if (block)
         new_delay_flag = delay_flag & (~O_NONBLOCK);
     else
         new_delay_flag = delay_flag | O_NONBLOCK;
     if (new_delay_flag != delay_flag)
         if (fcntl(s->sock_fd, F_SETFL, new_delay_flag) == -1)
-            goto error;
+            goto done;
 #endif
 #else /* MS_WINDOWS */
     arg = !block;
     if (ioctlsocket(s->sock_fd, FIONBIO, &arg) != 0)
-        goto error;
+        goto done;
 #endif /* MS_WINDOWS */
+
+    result = 0;
+
+  done:
     Py_END_ALLOW_THREADS
 
-    return 0;
-  error:
+    if (result) {
 #ifndef MS_WINDOWS
-    PyErr_SetFromErrno(PyExc_OSError);
+        PyErr_SetFromErrno(PyExc_OSError);
 #else
-    PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
+        PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
 #endif
-    return -1;
+    }
+
+    return result;
 }
 
 static int