chuck       96/06/07 13:02:05

  Modified:    src       http_main.c
  Log:
  Reviewed by:  Chuck Murcko
  Submitted by: Cliff Skolnick
  Obtained from:  [EMAIL PROTECTED]
  Sending a SIGTERM (as user root using /bin/sh as
  shell) doesn't terminate apache under Solaris 2.5
  (but other SVR4 systems are probably affected, too).
  
  After sending the SIGTERM, /usr/proc/bin/psig on the
  pid of the apache master process shows
      TERM        blocked,caught  0
  
  As far is I understand it, the problem is caused by
  jumping out of a signal handler using setjmp/longjmp
  instead of sigsetjmp/siglongjmp.
  
  Revision  Changes    Path
  1.34      +8 -1      apache/src/http_main.c
  
  Index: http_main.c
  ===================================================================
  RCS file: /export/home/cvs/apache/src/http_main.c,v
  retrieving revision 1.33
  retrieving revision 1.34
  diff -C3 -r1.33 -r1.34
  *** http_main.c       1996/06/07 19:51:16     1.33
  --- http_main.c       1996/06/07 20:02:03     1.34
  ***************
  *** 821,836 ****
    static int wait_or_timeout_retval = -1;
    
    static void longjmp_out_of_alarm (int sig) {
        longjmp (wait_timeout_buf, 1);
    }
    
    int wait_or_timeout (int *status)
    {
        wait_or_timeout_retval = -1;
        
        if (setjmp(wait_timeout_buf) != 0) {
        errno = ETIMEDOUT;
  -     alarm(0);
        return wait_or_timeout_retval;
        }
        
  --- 821,843 ----
    static int wait_or_timeout_retval = -1;
    
    static void longjmp_out_of_alarm (int sig) {
  + #ifdef NEXT
        longjmp (wait_timeout_buf, 1);
  + #else
  +     siglongjmp (wait_timeout_buf, 1);
  + #endif
    }
    
    int wait_or_timeout (int *status)
    {
        wait_or_timeout_retval = -1;
        
  + #if defined(NEXT)
        if (setjmp(wait_timeout_buf) != 0) {
  + #else 
  +     if (sigsetjmp(wait_timeout_buf, 1) != 0) {
  + #endif
        errno = ETIMEDOUT;
        return wait_or_timeout_retval;
        }
        
  
  
  

Reply via email to