Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 416f2e6

Browse files
committed
Issue #23618: internal_connect_select() now waits also for error events
1 parent e6951c6 commit 416f2e6

1 file changed

Lines changed: 15 additions & 6 deletions

File tree

Modules/socketmodule.c

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -592,14 +592,15 @@ internal_setblocking(PySocketSockObject *s, int block)
592592
}
593593

594594
static int
595-
internal_select_impl(PySocketSockObject *s, int writing, _PyTime_t interval)
595+
internal_select_impl(PySocketSockObject *s, int writing, _PyTime_t interval,
596+
int error)
596597
{
597598
int n;
598599
#ifdef HAVE_POLL
599600
struct pollfd pollfd;
600601
_PyTime_t ms;
601602
#else
602-
fd_set fds;
603+
fd_set fds, efds;
603604
struct timeval tv;
604605
#endif
605606

@@ -608,6 +609,9 @@ internal_select_impl(PySocketSockObject *s, int writing, _PyTime_t interval)
608609
assert(PyGILState_Check());
609610
#endif
610611

612+
/* Error condition is for output only */
613+
assert(!(error && !writing));
614+
611615
/* Nothing to do unless we're in timeout mode (not non-blocking) */
612616
if (s->sock_timeout <= 0)
613617
return 0;
@@ -625,6 +629,8 @@ internal_select_impl(PySocketSockObject *s, int writing, _PyTime_t interval)
625629
#ifdef HAVE_POLL
626630
pollfd.fd = s->sock_fd;
627631
pollfd.events = writing ? POLLOUT : POLLIN;
632+
if (error)
633+
pollfd.events |= POLLERR;
628634

629635
/* s->sock_timeout is in seconds, timeout in ms */
630636
ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
@@ -638,15 +644,18 @@ internal_select_impl(PySocketSockObject *s, int writing, _PyTime_t interval)
638644

639645
FD_ZERO(&fds);
640646
FD_SET(s->sock_fd, &fds);
647+
FD_ZERO(&efds);
648+
if (error)
649+
FD_SET(s->sock_fd, &efds);
641650

642651
/* See if the socket is ready */
643652
Py_BEGIN_ALLOW_THREADS;
644653
if (writing)
645654
n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
646-
NULL, &fds, NULL, &tv);
655+
NULL, &fds, &efds, &tv);
647656
else
648657
n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
649-
&fds, NULL, NULL, &tv);
658+
&fds, NULL, &efds, &tv);
650659
Py_END_ALLOW_THREADS;
651660
#endif
652661

@@ -665,13 +674,13 @@ internal_select_impl(PySocketSockObject *s, int writing, _PyTime_t interval)
665674
static int
666675
internal_select(PySocketSockObject *s, int writing, _PyTime_t interval)
667676
{
668-
return internal_select_impl(s, writing, interval);
677+
return internal_select_impl(s, writing, interval, 0);
669678
}
670679

671680
static int
672681
internal_connect_select(PySocketSockObject *s)
673682
{
674-
return internal_select(s, 1, s->sock_timeout);
683+
return internal_select(s, 1, s->sock_timeout, 1);
675684
}
676685

677686
/*

0 commit comments

Comments
 (0)