]> granicus.if.org Git - mutt/commitdiff
Block SIGWINCH during connect(). (closes #3941)
authorKevin McCarthy <kevin@8t8.us>
Tue, 20 Jun 2017 22:09:43 +0000 (15:09 -0700)
committerKevin McCarthy <kevin@8t8.us>
Tue, 20 Jun 2017 22:09:43 +0000 (15:09 -0700)
FreeBSD's connect() does not respect SA_RESTART, so a SIGWINCH will
end up interrupting the connect.

If this code is needed in other places, it should be moved into
signal.c.  For this one place, inlining the sigprocmask() seemed okay.

mutt_socket.c

index a2c489f657e30c3343a3c8d444d968fe46f801a3..08f21533b0232444af3afb45ec1ce98d8b26a9d3 100644 (file)
@@ -35,6 +35,7 @@
 #include <netinet/in.h>
 #include <netdb.h>
 #include <stdlib.h>
+#include <signal.h>
 #include <fcntl.h>
 #include <sys/types.h>
 #ifdef HAVE_SYS_TIME_H
@@ -344,6 +345,7 @@ static int socket_connect (int fd, struct sockaddr* sa)
 {
   int sa_size;
   int save_errno;
+  sigset_t set;
 
   if (sa->sa_family == AF_INET)
     sa_size = sizeof (struct sockaddr_in);
@@ -356,12 +358,18 @@ static int socket_connect (int fd, struct sockaddr* sa)
     dprint (1, (debugfile, "Unknown address family!\n"));
     return -1;
   }
-  
+
   if (ConnectTimeout > 0)
       alarm (ConnectTimeout);
 
   mutt_allow_interrupt (1);
 
+  /* FreeBSD's connect() does not respect SA_RESTART, meaning
+   * a SIGWINCH will cause the connect to fail. */
+  sigemptyset (&set);
+  sigaddset (&set, SIGWINCH);
+  sigprocmask (SIG_BLOCK, &set, NULL);
+
   save_errno = 0;
 
   if (connect (fd, sa, sa_size) < 0)
@@ -374,6 +382,7 @@ static int socket_connect (int fd, struct sockaddr* sa)
   if (ConnectTimeout > 0)
       alarm (0);
   mutt_allow_interrupt (0);
+  sigprocmask (SIG_UNBLOCK, &set, NULL);
 
   return save_errno;
 }