Linux Headquarters
[ Register ]
[ About us ] [ Home Page ]

Advertisement
[ Kernel ] [ Documentation ] [ Links ] [ Books ]

Advertisement

Kernel v2.6.25-rc4 /fs/exec.c

Filename:/fs/exec.c
Lines Added:25
Lines Deleted:38
Also changed in: (Previous) 2.6.25-rc3-git6  2.6.25-rc3-git5  2.6.25-rc3  2.6.25-rc2  2.6.25-rc1-git4  2.6.25-rc1 
(Following) 2.6.25-rc5  2.6.25-rc6  2.6.25-rc7  2.6.25-rc8  2.6.25-rc9  2.6.25 

Location
[  2.6.25-rc4
  [  fs
     o  exec.c

Patch

diff --git a/fs/exec.c b/fs/exec.c
index 282240a..54a0a55 100644
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -112,14 +112,14 @@ asmlinkage long sys_uselib(const char __user * library)
       goto out;
 
    error = -EINVAL;
-   if (!S_ISREG(nd.dentry->d_inode->i_mode))
+   if (!S_ISREG(nd.path.dentry->d_inode->i_mode))
       goto exit;
 
    error = vfs_permission(&nd, MAY_READ | MAY_EXEC);
    if (error)
       goto exit;
 
-   file = nameidata_to_filp(&nd, O_RDONLY);
+   file = nameidata_to_filp(&nd, O_RDONLY|O_LARGEFILE);
    error = PTR_ERR(file);
    if (IS_ERR(file))
       goto out;
@@ -148,7 +148,7 @@ out:
      return error;
 exit:
    release_open_intent(&nd);
-   path_release(&nd);
+   path_put(&nd.path);
    goto out;
 }
 
@@ -173,8 +173,15 @@ static struct page *get_arg_page(struct linux_binprm *bprm, unsigned long pos,
       return NULL;
 
    if (write) {
-      struct rlimit *rlim = current->signal->rlim;
       unsigned long size = bprm->vma->vm_end - bprm->vma->vm_start;
+      struct rlimit *rlim;
+
+      /*
+       * We've historically supported up to 32 pages (ARG_MAX)
+       * of argument strings even with small stacks
+       */
+      if (size <= ARG_MAX)
+         return page;
 
       /*
        * Limit to 1/4-th the stack size for the argv+env strings.
@@ -183,6 +190,7 @@ static struct page *get_arg_page(struct linux_binprm *bprm, unsigned long pos,
        *  - the program will have a reasonable amount of stack left
        *    to work from.
        */
+      rlim = current->signal->rlim;
       if (size > rlim[RLIMIT_STACK].rlim_cur / 4) {
          put_page(page);
          return NULL;
@@ -652,13 +660,14 @@ struct file *open_exec(const char *name)
    file = ERR_PTR(err);
 
    if (!err) {
-      struct inode *inode = nd.dentry->d_inode;
+      struct inode *inode = nd.path.dentry->d_inode;
       file = ERR_PTR(-EACCES);
       if (S_ISREG(inode->i_mode)) {
          int err = vfs_permission(&nd, MAY_EXEC);
          file = ERR_PTR(err);
          if (!err) {
-            file = nameidata_to_filp(&nd, O_RDONLY);
+            file = nameidata_to_filp(&nd,
+                     O_RDONLY|O_LARGEFILE);
             if (!IS_ERR(file)) {
                err = deny_write_access(file);
                if (err) {
@@ -671,7 +680,7 @@ out:
          }
       }
       release_open_intent(&nd);
-      path_release(&nd);
+      path_put(&nd.path);
    }
    goto out;
 }
@@ -760,7 +769,7 @@ static int de_thread(struct task_struct *tsk)
     */
    read_lock(&tasklist_lock);
    spin_lock_irq(lock);
-   if (sig->flags & SIGNAL_GROUP_EXIT) {
+   if (signal_group_exit(sig)) {
       /*
        * Another group action in progress, just
        * return so that the signal is processed.
@@ -778,31 +787,13 @@ static int de_thread(struct task_struct *tsk)
    if (unlikely(tsk->group_leader == task_child_reaper(tsk)))
       task_active_pid_ns(tsk)->child_reaper = tsk;
 
+   sig->group_exit_task = tsk;
    zap_other_threads(tsk);
    read_unlock(&tasklist_lock);
 
-   /*
-    * Account for the thread group leader hanging around:
-    */
-   count = 1;
-   if (!thread_group_leader(tsk)) {
-      count = 2;
-      /*
-       * The SIGALRM timer survives the exec, but needs to point
-       * at us as the new group leader now.  We have a race with
-       * a timer firing now getting the old leader, so we need to
-       * synchronize with any firing (by calling del_timer_sync)
-       * before we can safely let the old group leader die.
-       */
-      sig->tsk = tsk;
-      spin_unlock_irq(lock);
-      if (hrtimer_cancel(&sig->real_timer))
-         hrtimer_restart(&sig->real_timer);
-      spin_lock_irq(lock);
-   }
-
+   /* Account for the thread group leader hanging around: */
+   count = thread_group_leader(tsk) ? 1 : 2;
    sig->notify_count = count;
-   sig->group_exit_task = tsk;
    while (atomic_read(&sig->count) > count) {
       __set_current_state(TASK_UNINTERRUPTIBLE);
       spin_unlock_irq(lock);
@@ -871,15 +862,10 @@ static int de_thread(struct task_struct *tsk)
       leader->exit_state = EXIT_DEAD;
 
       write_unlock_irq(&tasklist_lock);
-        }
+   }
 
    sig->group_exit_task = NULL;
    sig->notify_count = 0;
-   /*
-    * There may be one thread left which is just exiting,
-    * but it's safe to stop telling the group to kill themselves.
-    */
-   sig->flags = 0;
 
 no_thread_group:
    exit_itimers(sig);
@@ -947,12 +933,13 @@ static void flush_old_files(struct files_struct * files)
    spin_unlock(&files->file_lock);
 }
 
-void get_task_comm(char *buf, struct task_struct *tsk)
+char *get_task_comm(char *buf, struct task_struct *tsk)
 {
    /* buf must be at least sizeof(tsk->comm) in size */
    task_lock(tsk);
    strncpy(buf, tsk->comm, sizeof(tsk->comm));
    task_unlock(tsk);
+   return buf;
 }
 
 void set_task_comm(struct task_struct *tsk, char *buf)
@@ -1188,7 +1175,7 @@ int search_binary_handler(struct linux_binprm *bprm,struct pt_regs *regs)
 {
    int try,retval;
    struct linux_binfmt *fmt;
-#ifdef __alpha__
+#if defined(__alpha__) && defined(CONFIG_ARCH_SUPPORTS_AOUT)
    /* handle /sbin/loader.. */
    {
        struct exec * eh = (struct exec *) bprm->buf;
@@ -1548,7 +1535,7 @@ static inline int zap_threads(struct task_struct *tsk, struct mm_struct *mm,
    int err = -EAGAIN;
 
    spin_lock_irq(&tsk->sighand->siglock);
-   if (!(tsk->signal->flags & SIGNAL_GROUP_EXIT)) {
+   if (!signal_group_exit(tsk->signal)) {
       tsk->signal->group_exit_code = exit_code;
       zap_process(tsk);
       err = 0;


Comments: webmaster (at) linuxhq.com.
Advertising: banners (at) linuxhq.com.
Compilation ©1998-2008 Linux Headquarters, Inc.