Well, unless someone can repair connect, here's a very ugly hack that
should prevent SIGWINCH from fucking ftp up.

Index: fetch.c
===================================================================
RCS file: /build/data/openbsd/cvs/src/usr.bin/ftp/fetch.c,v
retrieving revision 1.147
diff -u -p -r1.147 fetch.c
--- fetch.c     27 May 2016 15:16:16 -0000      1.147
+++ fetch.c     8 Aug 2016 10:46:30 -0000
@@ -557,16 +557,25 @@ noslash:
                }
 #endif /* !SMALL */
 
+               {
+                       sigset_t set;
+
+                       sigemptyset(&set);
+                       sigaddset(&set, SIGWINCH);
+                       sigprocmask(SIG_BLOCK, &set, NULL);
+
 again:
-               if (connect(s, res->ai_addr, res->ai_addrlen) < 0) {
-                       if (errno == EINTR)
-                               goto again;
-                       save_errno = errno;
-                       close(s);
-                       errno = save_errno;
-                       s = -1;
-                       cause = "connect";
-                       continue;
+                       if (connect(s, res->ai_addr, res->ai_addrlen) < 0) {
+                               if (errno == EINTR)
+                                       goto again;
+                               save_errno = errno;
+                               close(s);
+                               errno = save_errno;
+                               s = -1;
+                               cause = "connect";
+                               continue;
+                       }
+                       sigprocmask(SIG_UNBLOCK, &set, NULL);
                }
 
                /* get port in numeric */
Index: ftp.c
===================================================================
RCS file: /build/data/openbsd/cvs/src/usr.bin/ftp/ftp.c,v
retrieving revision 1.96
diff -u -p -r1.96 ftp.c
--- ftp.c       16 Mar 2016 15:41:11 -0000      1.96
+++ ftp.c       8 Aug 2016 10:47:08 -0000
@@ -74,6 +74,7 @@
 #include <errno.h>
 #include <netdb.h>
 #include <poll.h>
+#include <signal.h>
 #include <stdarg.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -219,9 +220,18 @@ hookup(char *host, char *port)
                        }
                }
 #endif /* !SMALL */
-               while ((error = connect(s, res->ai_addr, res->ai_addrlen)) < 0
-                               && errno == EINTR) {
-                       ;
+               {
+                       sigset_t set;
+
+                       sigemptyset(&set);
+                       sigaddset(&set, SIGWINCH);
+                       sigprocmask(SIG_BLOCK, &set, NULL);
+
+                       while ((error = connect(s, res->ai_addr, 
+                           res->ai_addrlen)) < 0 && errno == EINTR) {
+                               ;
+                       }
+                       sigprocmask(SIG_UNBLOCK, &set, NULL);
                }
                if (error) {
                        /* this "if" clause is to prevent print warning twice */

Reply via email to