Diff for /linux/kernel/exit.c between versions 1.1.1.7 and 1.1.1.8

version 1.1.1.7, 2018/04/24 18:06:31 version 1.1.1.8, 2018/04/24 18:07:55
Line 17 Line 17
   
 int sys_close(int fd);  int sys_close(int fd);
   
 inline int send_sig(long sig,struct task_struct * p,int priv)  int send_sig(long sig,struct task_struct * p,int priv)
 {  {
         if (!p || (sig < 0) || (sig > 32))          if (!p || (sig < 0) || (sig > 32))
                 return -EINVAL;                  return -EINVAL;
         if (!priv && (current->euid!=p->euid) && !suser())          if (!priv && ((sig != SIGCONT) || (current->session != p->session)) &&
               (current->euid != p->euid) && !suser())
                 return -EPERM;                  return -EPERM;
         if (!sig)          if (!sig)
                 return 0;                  return 0;
Line 167  void audit_ptree() Line 168  void audit_ptree()
 }  }
 #endif /* DEBUG_PROC_TREE */  #endif /* DEBUG_PROC_TREE */
   
   /*
    * This checks not only the pgrp, but falls back on the pid if no
    * satisfactory prgp is found. I dunno - gdb doesn't work correctly
    * without this...
    */
 int session_of_pgrp(int pgrp)  int session_of_pgrp(int pgrp)
 {  {
         struct task_struct **p;          struct task_struct **p;
           int fallback;
   
         for (p = &LAST_TASK ; p > &FIRST_TASK ; --p)          fallback = -1;
           for (p = &LAST_TASK ; p > &FIRST_TASK ; --p) {
                   if (!*p || (*p)->session <= 0)
                           continue;
                 if ((*p)->pgrp == pgrp)                  if ((*p)->pgrp == pgrp)
                         return((*p)->session);                          return (*p)->session;
         return -1;                  if ((*p)->pid == pgrp)
                           fallback = (*p)->session;
           }
           return fallback;
 }  }
   
 int kill_pg(int pgrp, int sig, int priv)  int kill_pg(int pgrp, int sig, int priv)
Line 186  int kill_pg(int pgrp, int sig, int priv) Line 199  int kill_pg(int pgrp, int sig, int priv)
         if (sig<0 || sig>32 || pgrp<=0)          if (sig<0 || sig>32 || pgrp<=0)
                 return -EINVAL;                  return -EINVAL;
         for (p = &LAST_TASK ; p > &FIRST_TASK ; --p)          for (p = &LAST_TASK ; p > &FIRST_TASK ; --p)
                 if ((*p)->pgrp == pgrp) {                  if (*p && (*p)->pgrp == pgrp) {
                         if (sig && (err = send_sig(sig,*p,priv)))                          if (sig && (err = send_sig(sig,*p,priv)))
                                 retval = err;                                  retval = err;
                         else                          else
Line 202  int kill_proc(int pid, int sig, int priv Line 215  int kill_proc(int pid, int sig, int priv
         if (sig<0 || sig>32)          if (sig<0 || sig>32)
                 return -EINVAL;                  return -EINVAL;
         for (p = &LAST_TASK ; p > &FIRST_TASK ; --p)          for (p = &LAST_TASK ; p > &FIRST_TASK ; --p)
                 if ((*p)->pid == pid)                  if (*p && (*p)->pid == pid)
                         return(sig ? send_sig(sig,*p,priv) : 0);                          return(sig ? send_sig(sig,*p,priv) : 0);
         return(-ESRCH);          return(-ESRCH);
 }  }
Line 220  int sys_kill(int pid,int sig) Line 233  int sys_kill(int pid,int sig)
                 return(kill_pg(current->pgrp,sig,0));                  return(kill_pg(current->pgrp,sig,0));
         if (pid == -1) {          if (pid == -1) {
                 while (--p > &FIRST_TASK)                  while (--p > &FIRST_TASK)
                         if ((*p)->pid > 1 && *p != current) {                          if (*p && (*p)->pid > 1 && *p != current) {
                                 ++count;                                  ++count;
                                 if ((err = send_sig(sig,*p,0)) != -EPERM)                                  if ((err = send_sig(sig,*p,0)) != -EPERM)
                                         retval = err;                                          retval = err;
Line 263  static int has_stopped_jobs(int pgrp) Line 276  static int has_stopped_jobs(int pgrp)
         struct task_struct ** p;          struct task_struct ** p;
   
         for (p = &LAST_TASK ; p > &FIRST_TASK ; --p) {          for (p = &LAST_TASK ; p > &FIRST_TASK ; --p) {
                 if ((*p)->pgrp != pgrp)                  if (!*p || (*p)->pgrp != pgrp)
                         continue;                          continue;
                 if ((*p)->state == TASK_STOPPED)                  if ((*p)->state == TASK_STOPPED)
                         return(1);                          return(1);
Line 287  volatile void do_exit(long code) Line 300  volatile void do_exit(long code)
         current->root = NULL;          current->root = NULL;
         iput(current->executable);          iput(current->executable);
         current->executable = NULL;          current->executable = NULL;
         iput(current->library);          for (i=0; i < current->numlibraries; i++) {
         current->library = NULL;                  iput(current->libraries[i].library);
                   current->libraries[i].library = NULL;
           }       
         current->state = TASK_ZOMBIE;          current->state = TASK_ZOMBIE;
         current->exit_code = code;          current->exit_code = code;
         current->rss = 0;          current->rss = 0;
Line 355  volatile void do_exit(long code) Line 370  volatile void do_exit(long code)
                         tty->session = 0;                          tty->session = 0;
                 }                  }
                 for (p = &LAST_TASK ; p > &FIRST_TASK ; --p)                  for (p = &LAST_TASK ; p > &FIRST_TASK ; --p)
                         if ((*p)->session == current->session)                          if (*p && (*p)->session == current->session)
                                 (*p)->tty = -1;                                  (*p)->tty = -1;
         }          }
         if (last_task_used_math == current)          if (last_task_used_math == current)
Line 394  repeat: Line 409  repeat:
                 }                  }
                 switch (p->state) {                  switch (p->state) {
                         case TASK_STOPPED:                          case TASK_STOPPED:
                                 if (!(options & WUNTRACED) ||                                   if (!p->exit_code)
                                     !p->exit_code)                                          continue;
                                   if (!(options & WUNTRACED) && !(p->flags & PF_PTRACED))
                                         continue;                                          continue;
                                 if (stat_addr)                                  if (stat_addr)
                                         put_fs_long((p->exit_code << 8) | 0x7f,                                          put_fs_long((p->exit_code << 8) | 0x7f,

Removed from v.1.1.1.7  
changed lines
  Added in v.1.1.1.8


unix.superglobalmegacorp.com