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

version 1.1.1.8, 2018/04/24 18:07:55 version 1.1.1.9, 2018/04/24 18:09:43
Line 22  int send_sig(long sig,struct task_struct Line 22  int send_sig(long sig,struct task_struct
         if (!p || (sig < 0) || (sig > 32))          if (!p || (sig < 0) || (sig > 32))
                 return -EINVAL;                  return -EINVAL;
         if (!priv && ((sig != SIGCONT) || (current->session != p->session)) &&          if (!priv && ((sig != SIGCONT) || (current->session != p->session)) &&
             (current->euid != p->euid) && !suser())              (current->euid != p->euid) && (current->uid != p->uid) && !suser())
                 return -EPERM;                  return -EPERM;
         if (!sig)          if (!sig)
                 return 0;                  return 0;
Line 42  int send_sig(long sig,struct task_struct Line 42  int send_sig(long sig,struct task_struct
                 /* save the signal number for wait. */                  /* save the signal number for wait. */
                 p->exit_code = sig;                  p->exit_code = sig;
   
                 /* we have to make sure the parent is awake. */                  /* we have to make sure the parent process is awake. */
                 if (p->p_pptr != NULL && p->p_pptr->state == TASK_INTERRUPTIBLE)                  if (p->p_pptr != NULL && p->p_pptr->state == TASK_INTERRUPTIBLE)
                         p->p_pptr->state = TASK_RUNNING;                          p->p_pptr->state = TASK_RUNNING;
   
Line 66  void release(struct task_struct * p) Line 66  void release(struct task_struct * p)
         for (i=1 ; i<NR_TASKS ; i++)          for (i=1 ; i<NR_TASKS ; i++)
                 if (task[i] == p) {                  if (task[i] == p) {
                         task[i] = NULL;                          task[i] = NULL;
                         /* Update links */                          REMOVE_LINKS(p);
                         if (p->p_osptr)  
                                 p->p_osptr->p_ysptr = p->p_ysptr;  
                         if (p->p_ysptr)  
                                 p->p_ysptr->p_osptr = p->p_osptr;  
                         else  
                                 p->p_pptr->p_cptr = p->p_osptr;  
                         free_page((long) p);                          free_page((long) p);
                         return;                          return;
                 }                  }
Line 284  static int has_stopped_jobs(int pgrp) Line 278  static int has_stopped_jobs(int pgrp)
         return(0);          return(0);
 }  }
   
   static void forget_original_parent(struct task_struct * father)
   {
           struct task_struct ** p;
   
           for (p = &LAST_TASK ; p > &FIRST_TASK ; --p)
                   if (*p && (*p)->p_opptr == father)
                           (*p)->p_opptr = task[1];
   }
   
 volatile void do_exit(long code)  volatile void do_exit(long code)
 {  {
         struct task_struct *p;          struct task_struct *p;
Line 294  volatile void do_exit(long code) Line 297  volatile void do_exit(long code)
         for (i=0 ; i<NR_OPEN ; i++)          for (i=0 ; i<NR_OPEN ; i++)
                 if (current->filp[i])                  if (current->filp[i])
                         sys_close(i);                          sys_close(i);
           forget_original_parent(current);
         iput(current->pwd);          iput(current->pwd);
         current->pwd = NULL;          current->pwd = NULL;
         iput(current->root);          iput(current->root);
Line 332  volatile void do_exit(long code) Line 336  volatile void do_exit(long code)
          * A.  Make init inherit all the child processes           * A.  Make init inherit all the child processes
          * B.  Check to see if any process groups have become orphaned           * B.  Check to see if any process groups have become orphaned
          *      as a result of our exiting, and if they have any stopped           *      as a result of our exiting, and if they have any stopped
          *      jons, send them a SIGUP and then a SIGCONT.  (POSIX 3.2.2.2)           *      jobs, send them a SIGHUP and then a SIGCONT.  (POSIX 3.2.2.2)
          */           */
         while (p = current->p_cptr) {          while (p = current->p_cptr) {
                 current->p_cptr = p->p_osptr;                  current->p_cptr = p->p_osptr;
                 p->p_ysptr = NULL;                  p->p_ysptr = NULL;
                 p->flags &= ~PF_PTRACED;                  p->flags &= ~PF_PTRACED;
                 p->p_pptr = task[1];                  p->p_pptr = task[1];
                 p->p_osptr = task[1]->p_cptr;                  p->p_osptr = p->p_pptr->p_cptr;
                 task[1]->p_cptr->p_ysptr = p;                  p->p_osptr->p_ysptr = p;
                 task[1]->p_cptr = p;                  p->p_pptr->p_cptr = p;
                 if (p->state == TASK_ZOMBIE)                  if (p->state == TASK_ZOMBIE)
                         task[1]->signal |= (1<<(SIGCHLD-1));                          p->p_pptr->signal |= (1<<(SIGCHLD-1));
                 /*                  /*
                  * process group orphan check                   * process group orphan check
                  * Case ii: Our child is in a different pgrp                    * Case ii: Our child is in a different pgrp 
Line 396  int sys_waitpid(pid_t pid,unsigned long  Line 400  int sys_waitpid(pid_t pid,unsigned long 
                 verify_area(stat_addr,4);                  verify_area(stat_addr,4);
 repeat:  repeat:
         flag=0;          flag=0;
         for (p = current->p_cptr ; p ; p = p->p_osptr) {          for (p = current->p_cptr ; p ; p = p->p_osptr) {
                 if (pid>0) {                  if (pid>0) {
                         if (p->pid != pid)                          if (p->pid != pid)
                                 continue;                                  continue;
Line 426  repeat: Line 430  repeat:
                                 flag = p->pid;                                  flag = p->pid;
                                 if (stat_addr)                                  if (stat_addr)
                                         put_fs_long(p->exit_code, stat_addr);                                          put_fs_long(p->exit_code, stat_addr);
                                 release(p);                                  if (p->p_opptr != p->p_pptr) {
                                           REMOVE_LINKS(p);
                                           p->p_pptr = p->p_opptr;
                                           SET_LINKS(p);
                                           send_sig(SIGCHLD,p->p_pptr,1);
                                   } else
                                           release(p);
 #ifdef DEBUG_PROC_TREE  #ifdef DEBUG_PROC_TREE
                                 audit_ptree();                                  audit_ptree();
 #endif  #endif
Line 451  repeat: Line 461  repeat:
         }          }
         return -ECHILD;          return -ECHILD;
 }  }
   
   

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


unix.superglobalmegacorp.com