From 146cf1d1c0b3e2fe862af64f15ac44acc9c9a978 Mon Sep 17 00:00:00 2001
From: Sergey Lyubka <valenok@gmail.com>
Date: Thu, 12 Dec 2013 13:43:59 +0000
Subject: [PATCH] Calling mg_socketpair() in a loop until success. Ignoring
 SIGPIPE. Squashed waring in mg_start_thread()

---
 mongoose.c | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/mongoose.c b/mongoose.c
index 20ffb1091..5699e5559 100644
--- a/mongoose.c
+++ b/mongoose.c
@@ -316,9 +316,8 @@ void *mg_start_thread(void *(*f)(void *), void *p) {
 #ifdef _WIN32
   return (void *) _beginthread((void (__cdecl *)(void *)) f, 0, p);
 #else
-  pthread_t thread_id;
+  pthread_t thread_id = (pthread_t) 0;
   pthread_attr_t attr;
-  int result;
 
   (void) pthread_attr_init(&attr);
   (void) pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
@@ -328,7 +327,7 @@ void *mg_start_thread(void *(*f)(void *), void *p) {
   (void) pthread_attr_setstacksize(&attr, USE_STACK_SIZE);
 #endif
 
-  result = pthread_create(&thread_id, &attr, f, p);
+  pthread_create(&thread_id, &attr, f, p);
   pthread_attr_destroy(&attr);
 
   return (void *) thread_id;
@@ -785,7 +784,13 @@ static void open_cgi_endpoint(struct connection *conn, const char *prog) {
     p = (char *) prog;
   }
 
-  mg_socketpair(fds);
+  // Try to create socketpair in a loop until success. mg_socketpair()
+  // can be interrupted by a signal and fail.
+  // TODO(lsm): use sigaction to restart interrupted syscall
+  do {
+    mg_socketpair(fds);
+  } while (fds[0] < 0);
+
   if (start_process(conn->server->config_options[CGI_INTERPRETER],
                     prog, blk.buf, blk.vars, dir, fds[1]) > 0) {
     conn->endpoint_type = EP_CGI;
@@ -3310,6 +3315,10 @@ struct mg_server *mg_create_server(void *server_data) {
 #ifdef _WIN32
   WSADATA data;
   WSAStartup(MAKEWORD(2, 2), &data);
+#else
+  // Ignore SIGPIPE signal, so if browser cancels the request, it
+  // won't kill the whole process.
+  signal(SIGPIPE, SIG_IGN);
 #endif
 
   LINKED_LIST_INIT(&server->active_connections);
-- 
GitLab