diff options
| -rw-r--r-- | lib/hostip.c | 24 | 
1 files changed, 15 insertions, 9 deletions
diff --git a/lib/hostip.c b/lib/hostip.c index 4acf1217e..68ceedc6d 100644 --- a/lib/hostip.c +++ b/lib/hostip.c @@ -571,15 +571,6 @@ int Curl_resolv_timeout(struct connectdata *conn,      return CURLRESOLV_TIMEDOUT;    if (timeout > 0) { -    /* This allows us to time-out from the name resolver, as the timeout -       will generate a signal and we will siglongjmp() from that here. -       This technique has problems (see alarmfunc). */ -      if(sigsetjmp(curl_jmpenv, 1)) { -        /* this is coming from a siglongjmp() after an alarm signal */ -        failf(data, "name lookup timed out"); -        return CURLRESOLV_ERROR; -      } -      /*************************************************************       * Set signal handler to catch SIGALRM       * Store the old value to be able to set it back later! @@ -605,6 +596,19 @@ int Curl_resolv_timeout(struct connectdata *conn,      /* alarm() makes a signal get sent when the timeout fires off, and that         will abort system calls */      prev_alarm = alarm((unsigned int) (timeout/1000L)); + +    /* This allows us to time-out from the name resolver, as the timeout +       will generate a signal and we will siglongjmp() from that here. +       This technique has problems (see alarmfunc). +       This should be the last thing we do before calling Curl_resolv(), +       as otherwise we'd have to worry about variables that get modified +       before we invoke Curl_resolv() (and thus use "volatile"). */ +    if(sigsetjmp(curl_jmpenv, 1)) { +      /* this is coming from a siglongjmp() after an alarm signal */ +      failf(data, "name lookup timed out"); +      rc = CURLRESOLV_ERROR; +      goto clean_up; +    }    }  #else @@ -621,6 +625,8 @@ int Curl_resolv_timeout(struct connectdata *conn,     */    rc = Curl_resolv(conn, hostname, port, entry); +clean_up: +  #ifdef USE_ALARM_TIMEOUT    if (timeout > 0) {  | 
