@@ -592,14 +592,15 @@ internal_setblocking(PySocketSockObject *s, int block)
592592}
593593
594594static 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)
665674static int
666675internal_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
671680static int
672681internal_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