aboutsummaryrefslogtreecommitdiff
path: root/lib/hostip.c
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2002-06-11 15:10:18 +0000
committerDaniel Stenberg <daniel@haxx.se>2002-06-11 15:10:18 +0000
commit3c49b405de4fbf1fd7127f91908261268640e54f (patch)
tree935a71bd0bfc907bd5046fdb84e2f48ea3795465 /lib/hostip.c
parent4cfffd6c4a50df7de82bfcaa2c0466be07801290 (diff)
Now uses sigsetjmp() and siglongjmp() to bail out from slow name lookups in
case a timeout is set. This seems to work. God knows if it is good enough or what kind of side-effects we introduce here and now. I'll close my eyes and cross my fingers. Hard.
Diffstat (limited to 'lib/hostip.c')
-rw-r--r--lib/hostip.c17
1 files changed, 17 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) {