Commit 3c49b405 authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

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.
parent 4cfffd6c
Loading
Loading
Loading
Loading
+37 −22
Original line number Diff line number Diff line
@@ -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 <setjmp.h>],
               [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 \
+17 −0
Original line number Diff line number Diff line
@@ -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) {
+9 −0
Original line number Diff line number Diff line
@@ -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