fielding    97/05/28 21:50:29

  Modified:    src       CHANGES conf.h http_main.c rfc1413.c
  Log:
  Fixed problem on Irix with servers hanging in IdentityCheck,
  apparently due to a mismatch between sigaction and setjmp.
  
  Submitted by: Roy Fielding, PR#502
  Reviewed by: Jim Jagielski, Randy Terbush, Dean Gaudet
  
  Revision  Changes    Path
  1.283     +4 -0      apache/src/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /export/home/cvs/apache/src/CHANGES,v
  retrieving revision 1.282
  retrieving revision 1.283
  diff -C3 -r1.282 -r1.283
  *** CHANGES   1997/05/29 04:23:11     1.282
  --- CHANGES   1997/05/29 04:50:25     1.283
  ***************
  *** 3,8 ****
  --- 3,12 ----
      *) Added undocumented perl SSI mechanism for -DUSE_PERL_SSI and mod_perl.
         [Rob Hartill]
    
  +   *) Fixed problem on Irix with servers hanging in IdentityCheck,
  +      apparently due to a mismatch between sigaction and setjmp.
  +      [Roy Fielding] PR#502
  + 
      *) Log correct status code if we timeout before receiving a request (408)
         or if we received a request-line that was too long to process (414).
         [Ed Korthof and Roy Fielding] PR#601
  
  
  
  1.98      +10 -1     apache/src/conf.h
  
  Index: conf.h
  ===================================================================
  RCS file: /export/home/cvs/apache/src/conf.h,v
  retrieving revision 1.97
  retrieving revision 1.98
  diff -C3 -r1.97 -r1.98
  *** conf.h    1997/05/01 17:36:24     1.97
  --- conf.h    1997/05/29 04:50:26     1.98
  ***************
  *** 61,67 ****
    
    /* Define one of these according to your system. */
    #if defined(MPE)
  - #include <setjmp.h>
    #include <sys/times.h>
    #define JMP_BUF sigjmp_buf
    #define NO_SETSID
  --- 61,66 ----
  ***************
  *** 650,655 ****
  --- 649,664 ----
    #endif
    #define signal(s,f) ap_signal(s,f)
    Sigfunc *signal(int signo, Sigfunc *func);
  + #endif
  + 
  + #include <setjmp.h>
  + 
  + #if defined(USE_LONGJMP)
  + #define ap_longjmp(x, y)        longjmp((x), (y))
  + #define ap_setjmp(x)            setjmp(x)
  + #else
  + #define ap_longjmp(x, y)        siglongjmp((x), (y))
  + #define ap_setjmp(x)            sigsetjmp((x), 1)
    #endif
    
    /* Finding offsets of elements within structures.
  
  
  
  1.149     +0 -9      apache/src/http_main.c
  
  Index: http_main.c
  ===================================================================
  RCS file: /export/home/cvs/apache/src/http_main.c,v
  retrieving revision 1.148
  retrieving revision 1.149
  diff -C3 -r1.148 -r1.149
  *** http_main.c       1997/05/29 03:10:52     1.148
  --- http_main.c       1997/05/29 04:50:27     1.149
  ***************
  *** 84,90 ****
    #include "http_conf_globals.h"
    #include "http_core.h"          /* for get_remote_host */
    #include "scoreboard.h"
  - #include <setjmp.h>
    #include <assert.h>
    #include <sys/stat.h>
    #ifdef HAVE_SHMGET
  --- 84,89 ----
  ***************
  *** 180,193 ****
    #define ap_killpg(x, y)             (kill (-(x), (y)))
    #else
    #define ap_killpg(x, y)             (killpg ((x), (y)))
  - #endif
  - 
  - #if defined(USE_LONGJMP)
  - #define ap_longjmp(x, y)    (longjmp ((x), (y)))
  - #define ap_setjmp(x)                (setjmp (x))
  - #else
  - #define ap_longjmp(x, y)    (siglongjmp ((x), (y)))
  - #define ap_setjmp(x)                (sigsetjmp ((x), 1))
    #endif
    
    #if defined(USE_FCNTL_SERIALIZED_ACCEPT)
  --- 179,184 ----
  
  
  
  1.10      +10 -14    apache/src/rfc1413.c
  
  Index: rfc1413.c
  ===================================================================
  RCS file: /export/home/cvs/apache/src/rfc1413.c,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -C3 -r1.9 -r1.10
  *** rfc1413.c 1997/03/07 17:43:36     1.9
  --- rfc1413.c 1997/05/29 04:50:27     1.10
  ***************
  *** 72,85 ****
    
    /* Rewritten by David Robinson */
    
  ! #include "httpd.h"    /* for server_rec, conn_rec */
    #include "http_log.h" /* for log_unixerr */
    #include "rfc1413.h"
    
  - /* System libraries. */
  - 
  - #include <setjmp.h>
  - 
    #ifndef SCO
    extern char *strchr();
    extern char *inet_ntoa();
  --- 72,81 ----
    
    /* Rewritten by David Robinson */
    
  ! #include "httpd.h"    /* for server_rec, conn_rec, ap_longjmp, etc. */
    #include "http_log.h" /* for log_unixerr */
    #include "rfc1413.h"
    
    #ifndef SCO
    extern char *strchr();
    extern char *inet_ntoa();
  ***************
  *** 93,105 ****
    /* rough limit on the amount of data we accept. */
    #define RFC1413_MAXDATA 1000
    
    #define RFC1413_TIMEOUT     30
    #define     ANY_PORT        0               /* Any old port will do */
    #define FROM_UNKNOWN  "unknown"
    
  ! int rfc1413_timeout = RFC1413_TIMEOUT;/* Global so it can be changed */
  ! 
  ! static jmp_buf timebuf;
    
    /* bind_connect - bind both ends of a socket */
    
  --- 89,101 ----
    /* rough limit on the amount of data we accept. */
    #define RFC1413_MAXDATA 1000
    
  + #ifndef RFC1413_TIMEOUT
    #define RFC1413_TIMEOUT     30
  + #endif
    #define     ANY_PORT        0               /* Any old port will do */
    #define FROM_UNKNOWN  "unknown"
    
  ! JMP_BUF timebuf;
    
    /* bind_connect - bind both ends of a socket */
    
  ***************
  *** 182,192 ****
        return 0;
    }
    
  ! /* timeout - handle timeouts */
    static void
  ! timeout(int sig)
    {
  !     longjmp(timebuf, sig);
    }
    
    /* rfc1413 - return remote user name, given socket structures */
  --- 178,188 ----
        return 0;
    }
    
  ! /* ident_timeout - handle timeouts */
    static void
  ! ident_timeout(int sig)
    {
  !     ap_longjmp(timebuf, sig);
    }
    
    /* rfc1413 - return remote user name, given socket structures */
  ***************
  *** 209,218 ****
        /*
         * Set up a timer so we won't get stuck while waiting for the server.
         */
  !     if (setjmp(timebuf) == 0)
        {
  !     signal(SIGALRM, timeout);
  !     alarm(rfc1413_timeout);
        
        if (get_rfc1413(sock, &conn->local_addr, &conn->remote_addr, user,
                      srv)
  --- 205,214 ----
        /*
         * Set up a timer so we won't get stuck while waiting for the server.
         */
  !     if (ap_setjmp(timebuf) == 0)
        {
  !     signal(SIGALRM, ident_timeout);
  !     alarm(RFC1413_TIMEOUT);
        
        if (get_rfc1413(sock, &conn->local_addr, &conn->remote_addr, user,
                      srv)
  
  
  

Reply via email to