Diff for /linux/kernel/signal.c between versions 1.1.1.3 and 1.1.1.4

version 1.1.1.3, 2018/04/24 18:03:19 version 1.1.1.4, 2018/04/24 18:04:29
Line 9 Line 9
 #include <asm/segment.h>  #include <asm/segment.h>
   
 #include <signal.h>  #include <signal.h>
   #include <sys/wait.h>
 #include <errno.h>  #include <errno.h>
       
   int send_sig (int, struct task_struct *, int);
     
 int sys_sgetmask()  int sys_sgetmask()
 {  {
         return current->blocked;          return current->blocked;
Line 125  int core_dump(long signr) Line 128  int core_dump(long signr)
         return(0);      /* We didn't do a dump */          return(0);      /* We didn't do a dump */
 }  }
   
 int do_signal(long signr,long eax,long ebx, long ecx, long edx, long orig_eax,  extern int sys_waitpid(pid_t pid,unsigned long * stat_addr, int options);
         long fs, long es, long ds,  
   int do_signal(long signr,long ebx, long ecx, long edx,
                 long esi, long edi, long ebp, long eax,
                 long ds, long es, long fs, long gs,
                 long orig_eax,
         long eip, long cs, long eflags,          long eip, long cs, long eflags,
         unsigned long * esp, long ss)          unsigned long * esp, long ss)
 {  {
Line 153  int do_signal(long signr,long eax,long e Line 160  int do_signal(long signr,long eax,long e
                 }                  }
         }          }
         sa_handler = (unsigned long) sa->sa_handler;          sa_handler = (unsigned long) sa->sa_handler;
         if (sa_handler==1)          if (sa_handler==1) {
   /* check for SIGCHLD: it's special */
                   if (signr == SIGCHLD)
                           while (sys_waitpid(-1,NULL,WNOHANG) > 0)
                                   /* nothing */;
                 return(1);   /* Ignore, see if there are more signals... */                  return(1);   /* Ignore, see if there are more signals... */
           }
         if (!sa_handler) {          if (!sa_handler) {
                 switch (signr) {                  switch (signr) {
                 case SIGCONT:                  case SIGCONT:
                 case SIGCHLD:                  case SIGCHLD:
                   case SIGWINCH:
                         return(1);  /* Ignore, ... */                          return(1);  /* Ignore, ... */
   
                 case SIGSTOP:                  case SIGSTOP:
Line 169  int do_signal(long signr,long eax,long e Line 182  int do_signal(long signr,long eax,long e
                         current->exit_code = signr;                          current->exit_code = signr;
                         if (!(current->p_pptr->sigaction[SIGCHLD-1].sa_flags &                           if (!(current->p_pptr->sigaction[SIGCHLD-1].sa_flags & 
                                         SA_NOCLDSTOP))                                          SA_NOCLDSTOP))
                                 current->p_pptr->signal |= (1<<(SIGCHLD-1));                            send_sig(SIGCHLD, current->p_pptr, 1);
   /*                              current->p_pptr->signal |= (1<<(SIGCHLD-1));*/
                           
                         return(1);  /* Reschedule another event */                          return(1);  /* Reschedule another event */
   
                 case SIGQUIT:                  case SIGQUIT:
Line 205  int do_signal(long signr,long eax,long e Line 220  int do_signal(long signr,long eax,long e
         put_fs_long(eflags,tmp_esp++);          put_fs_long(eflags,tmp_esp++);
         put_fs_long(old_eip,tmp_esp++);          put_fs_long(old_eip,tmp_esp++);
         current->blocked |= sa->sa_mask;          current->blocked |= sa->sa_mask;
   /* force a supervisor-mode page-in of the signal handler to reduce races */
           __asm__("testb $0,%%fs:%0"::"m" (*(char *) sa_handler));
         return(0);              /* Continue, execute handler */          return(0);              /* Continue, execute handler */
 }  }

Removed from v.1.1.1.3  
changed lines
  Added in v.1.1.1.4


unix.superglobalmegacorp.com