]> Pileus Git - ~andy/fetchmail/commitdiff
switch setjmp/longjmp to sigsetjmp/siglongjmp
authorMatthias Andree <matthias.andree@gmx.de>
Sun, 13 Aug 2006 23:27:17 +0000 (23:27 -0000)
committerMatthias Andree <matthias.andree@gmx.de>
Sun, 13 Aug 2006 23:27:17 +0000 (23:27 -0000)
svn path=/branches/BRANCH_6-3/; revision=4892

NEWS
driver.c

diff --git a/NEWS b/NEWS
index 589f0a0f96c9fb03fb6047c9481d7453aba85e03..8a733baecf6dc118a479406bca2f7a1dc01545a4 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -120,6 +120,7 @@ fetchmail 6.3.5 (not yet released):
 * Fetchmail in verbose mode now logs if it opportunistically upgrades a POP3
   or IMAP connection to TLS security with STLS/STARTTLS.
 * fetchmail now supports foo@example.org=bar user mappings for multidrop boxes.
+* switch setjmp/longjmp to sigsetjmp/siglongjmp
 
 # TRANSLATION UPDATES:
 * Russian/ru (Pavel Maryanov), Vietnamese/vi (Clytie Siddall)
index c9d3e6a0f3032d616fbc944223514228ddf9153e..c1d38a41766ef2c38ebab9ac9334d98c297eaceb 100644 (file)
--- a/driver.c
+++ b/driver.c
@@ -75,7 +75,7 @@ struct addrinfo *ai0, *ai1;   /* clean these up after signal */
 static volatile int timeoutcount = 0;  /* count consecutive timeouts */
 static volatile int idletimeout = 0;   /* timeout occured in idle stage? */
 
-static jmp_buf restart;
+static sigjmp_buf      restart;
 
 int is_idletimeout(void)
 /* last timeout occured in idle stage? */
@@ -110,7 +110,7 @@ static RETSIGTYPE timeout_handler (int signal)
     (void)signal;
     if(stage != STAGE_IDLE) {
        timeoutcount++;
-       longjmp(restart, THROW_TIMEOUT);
+       siglongjmp(restart, THROW_TIMEOUT);
     } else
        idletimeout = 1;
 }
@@ -119,7 +119,7 @@ static RETSIGTYPE sigpipe_handler (int signal)
 /* handle SIGPIPE signal indicating a broken stream socket */
 {
     (void)signal;
-    longjmp(restart, THROW_SIGPIPE);
+    siglongjmp(restart, THROW_SIGPIPE);
 }
 
 #define CLEANUP_TIMEOUT 60 /* maximum timeout during cleanup */
@@ -862,24 +862,13 @@ static int do_session(
     /* set up the broken-pipe timeout */
     pipesave = set_signal_handler(SIGPIPE, sigpipe_handler);
 
-    if ((js = setjmp(restart)))
+    if ((js = sigsetjmp(restart,1)))
     {
        /* exception caught */
-#ifdef HAVE_SIGPROCMASK
-       /*
-        * Don't rely on setjmp() to restore the blocked-signal mask.
-        * It does this under BSD but is required not to under POSIX.
-        *
-        * If your Unix doesn't have sigprocmask, better hope it has
-        * BSD-like behavior.  Otherwise you may see fetchmail get
-        * permanently wedged after a second timeout on a bad read,
-        * because alarm signals were blocked after the first.
-        */
        sigset_t        allsigs;
 
        sigfillset(&allsigs);
        sigprocmask(SIG_UNBLOCK, &allsigs, NULL);
-#endif /* HAVE_SIGPROCMASK */
 
        if (ai0) {
            freeaddrinfo(ai0); ai0 = NULL;