@@ -653,10 +653,6 @@ w32_select(int fds, w32_fd_set* readfds, w32_fd_set* writefds, w32_fd_set* excep
653653 if (writefds && FD_ISSET (i , writefds )) {
654654 in_set_fds ++ ;
655655 if (w32_io_is_io_available (fd_table .w32_ios [i ], FALSE)) {
656- /* for connect() completed sockets finish WSA connect process*/
657- if ((fd_table .w32_ios [i ]-> type == SOCK_FD )
658- && ((fd_table .w32_ios [i ]-> internal .state == SOCK_CONNECTING )))
659- socketio_finish_connect (fd_table .w32_ios [i ]);
660656 FD_SET (i , & write_ready_fds );
661657 out_ready_fds ++ ;
662658 }
@@ -676,9 +672,23 @@ w32_select(int fds, w32_fd_set* readfds, w32_fd_set* writefds, w32_fd_set* excep
676672
677673 if (writefds )
678674 for (i = 0 ; i < fds ; i ++ )
679- if (FD_ISSET (i , writefds ) && (!FD_ISSET (i , & write_ready_fds )))
680- FD_CLR (i , writefds );
681-
675+ if (FD_ISSET (i , writefds )) {
676+ if (FD_ISSET (i , & write_ready_fds )) {
677+ /* for connect() completed sockets finish WSA connect process*/
678+ if ((fd_table .w32_ios [i ]-> type == SOCK_FD )
679+ && ((fd_table .w32_ios [i ]-> internal .state == SOCK_CONNECTING )))
680+ if (socketio_finish_connect (fd_table .w32_ios [i ]) != 0 ) {
681+ /* finalizeing connect failed - recored error */
682+ /* error gets picked up later recv and/or send*/
683+ fd_table .w32_ios [i ]-> read_details .error = errno ;
684+ fd_table .w32_ios [i ]-> write_details .error = errno ;
685+ fd_table .w32_ios [i ]-> internal .state = SOCK_CONNECTED ;
686+ errno = 0 ;
687+ }
688+ }
689+ else
690+ FD_CLR (i , writefds );
691+ }
682692
683693 debug3 ("select - returning %d" , out_ready_fds );
684694 return out_ready_fds ;
0 commit comments