From 3c49b405de4fbf1fd7127f91908261268640e54f Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Tue, 11 Jun 2002 15:10:18 +0000 Subject: [PATCH] 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. --- configure.in | 59 ++++++++++++++++++++++++++++++++-------------------- lib/hostip.c | 17 +++++++++++++++ lib/url.c | 9 ++++++++ 3 files changed, 63 insertions(+), 22 deletions(-) diff --git a/configure.in b/configure.in index d83affc37..409ae66e5 100644 --- a/configure.in +++ b/configure.in @@ -55,26 +55,6 @@ dnl The install stuff has already been taken care of by the automake stuff dnl AC_PROG_INSTALL AC_PROG_MAKE_SET -dnl ************************************************************ -dnl lame option to switch on debug options -dnl -AC_MSG_CHECKING([whether to enable debug options]) -AC_ARG_ENABLE(debug, -[ --enable-debug Enable pedantic debug options - --disable-debug Disable debug options], -[ case "$enableval" in - no) - AC_MSG_RESULT(no) - ;; - *) AC_MSG_RESULT(yes) - - CPPFLAGS="$CPPFLAGS -DMALLOCDEBUG" - CFLAGS="-W -Wall -Wwrite-strings -pedantic -Wundef -Wpointer-arith -Wcast-align -Wnested-externs -g" - ;; - esac ], - AC_MSG_RESULT(no) -) - dnl ************************************************************ dnl switch off particular protocols dnl @@ -623,7 +603,8 @@ AC_CHECK_HEADERS( \ io.h \ pwd.h \ utime.h \ - sys/utime.h + sys/utime.h \ + setjmp.h ) dnl Check for libz header @@ -678,9 +659,23 @@ AC_CHECK_FUNCS( socket \ getpwuid \ geteuid \ dlopen \ - utime + utime \ + sigsetjmp ) +dnl sigsetjmp() might be a macro and no function so if it isn't found already +dnl we make an extra check here! +if test "$ac_cv_func_sigsetjmp" != "yes"; then + AC_MSG_CHECKING([for sigsetjmp defined as macro]) + AC_TRY_LINK( [#include ], + [sigjmp_buf jmpenv; + sigsetjmp(jmpenv, 1);], + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_SIGSETJMP), + AC_MSG_RESULT(no) + ) +fi + dnl removed 'getpass' check on October 26, 2000 if test "$ac_cv_func_select" != "yes"; then @@ -704,6 +699,26 @@ dnl AC_PATH_PROG( RANLIB, ranlib, /usr/bin/ranlib, dnl $PATH:/usr/bin/:/usr/local/bin ) dnl AC_SUBST(RANLIB) +dnl ************************************************************ +dnl lame option to switch on debug options +dnl +AC_MSG_CHECKING([whether to enable debug options]) +AC_ARG_ENABLE(debug, +[ --enable-debug Enable pedantic debug options + --disable-debug Disable debug options], +[ case "$enableval" in + no) + AC_MSG_RESULT(no) + ;; + *) AC_MSG_RESULT(yes) + + CPPFLAGS="$CPPFLAGS -DMALLOCDEBUG" + CFLAGS="-W -Wall -Wwrite-strings -pedantic -Wundef -Wpointer-arith -Wcast-align -Wnested-externs -g" + ;; + esac ], + AC_MSG_RESULT(no) +) + AC_CONFIG_FILES([Makefile \ docs/Makefile \ docs/examples/Makefile \ 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 +#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) { diff --git a/lib/url.c b/lib/url.c index fc4529c8e..44c13ccb1 100644 --- a/lib/url.c +++ b/lib/url.c @@ -72,6 +72,10 @@ #include #endif +#ifdef HAVE_SETJMP_H +#include +#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