mirror of
https://github.com/python/cpython.git
synced 2025-07-24 03:35:53 +00:00
Issue #28471: Fix crash (GIL state related) in socket.setblocking
This commit is contained in:
parent
33bb64fb30
commit
fa22b29960
3 changed files with 31 additions and 9 deletions
|
@ -622,6 +622,7 @@ set_gaierror(int error)
|
|||
static int
|
||||
internal_setblocking(PySocketSockObject *s, int block)
|
||||
{
|
||||
int result = -1;
|
||||
#ifdef MS_WINDOWS
|
||||
u_long arg;
|
||||
#endif
|
||||
|
@ -641,34 +642,39 @@ internal_setblocking(PySocketSockObject *s, int block)
|
|||
#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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue