]> granicus.if.org Git - curl/commitdiff
sws: handle EINTR when calling select()
authorMichael Kaufmann <mail@michael-kaufmann.ch>
Sun, 29 Jul 2018 11:47:31 +0000 (13:47 +0200)
committerJay Satiro <raysatiro@yahoo.com>
Sun, 29 Jul 2018 18:52:02 +0000 (14:52 -0400)
Closes https://github.com/curl/curl/pull/2808

tests/server/sws.c

index ec11224f57d3c107199ba5b00dd6eb948af84473..4879cfa8b1f2100c4aa161adda4e90103a2b2735 100644 (file)
@@ -1536,18 +1536,18 @@ static void http_connect(curl_socket_t *infdp,
     if(got_exit_signal)
       break;
 
-    rc = select((int)maxfd + 1, &input, &output, NULL, &timeout);
+    do {
+      rc = select((int)maxfd + 1, &input, &output, NULL, &timeout);
+    } while(rc < 0 && errno == EINTR && !got_exit_signal);
+
+    if(got_exit_signal)
+      break;
 
     if(rc > 0) {
       /* socket action */
-      bool tcp_fin_wr;
+      bool tcp_fin_wr = FALSE;
       timeout_count = 0;
 
-      if(got_exit_signal)
-        break;
-
-      tcp_fin_wr = FALSE;
-
       /* ---------------------------------------------------------- */
 
       /* passive mode FTP may establish a secondary tunnel */
@@ -2289,7 +2289,13 @@ int main(int argc, char *argv[])
     if(got_exit_signal)
       goto sws_cleanup;
 
-    rc = select((int)maxfd + 1, &input, &output, NULL, &timeout);
+    do {
+      rc = select((int)maxfd + 1, &input, &output, NULL, &timeout);
+    } while(rc < 0 && errno == EINTR && !got_exit_signal);
+
+    if(got_exit_signal)
+      goto sws_cleanup;
+
     if(rc < 0) {
       error = SOCKERRNO;
       logmsg("select() failed with error: (%d) %s",
@@ -2297,9 +2303,6 @@ int main(int argc, char *argv[])
       goto sws_cleanup;
     }
 
-    if(got_exit_signal)
-      goto sws_cleanup;
-
     if(rc == 0) {
       /* Timed out - try again */
       continue;