diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/hostip.c | 17 | ||||
-rw-r--r-- | lib/url.c | 9 |
2 files changed, 26 insertions, 0 deletions
diff --git a/lib/hostip.c b/lib/hostip.c index c6cd28b75..84ced78de 100644 --- a/lib/hostip.c +++ b/lib/hostip.c @@ -56,6 +56,10 @@ #endif #endif +#ifdef HAVE_SETJMP_H +#include <setjmp.h> +#endif + #include "urldata.h" #include "sendf.h" #include "hostip.h" @@ -191,6 +195,11 @@ hostcache_prune(curl_hash *hostcache, int cache_timeout, int now) return (__v); \ } +#ifdef HAVE_SIGSETJMP +/* Beware this is a global and unique instance */ +sigjmp_buf curl_jmpenv; +#endif + Curl_addrinfo *Curl_resolv(struct SessionHandle *data, char *hostname, int port) @@ -201,6 +210,14 @@ Curl_addrinfo *Curl_resolv(struct SessionHandle *data, time_t now; char *bufp; +#ifdef HAVE_SIGSETJMP + if(sigsetjmp(curl_jmpenv, 1) != 0) { + /* this is coming from a siglongjmp() */ + failf(data, "name lookup time-outed"); + return NULL; + } +#endif + /* If the host cache timeout is 0, we don't do DNS cach'ing so fall through */ if (data->set.dns_cache_timeout == 0) { @@ -72,6 +72,10 @@ #include <inet.h> #endif +#ifdef HAVE_SETJMP_H +#include <setjmp.h> +#endif + #ifndef HAVE_SELECT #error "We can't compile without select() support!" #endif @@ -120,6 +124,7 @@ #ifdef KRB4 #include "security.h" #endif + /* The last #include file should be: */ #ifdef MALLOCDEBUG #include "memdebug.h" @@ -143,6 +148,10 @@ RETSIGTYPE alarmfunc(int signal) { /* this is for "-ansi -Wall -pedantic" to stop complaining! (rabe) */ (void)signal; +#ifdef HAVE_SIGSETJMP + extern sigjmp_buf curl_jmpenv; + siglongjmp(curl_jmpenv, 1); +#endif return; } #endif |