From:Suzuki K. Poulose <suz...@in.ibm.com>

fill_psinfo() fills the NT_PRPSINFO note for the core. NT_PRPSINFO stores the
command line of the process, which is stored at from mm->arg_start. Make
fill_psinfo reusable by supporting other tasks. Use access_process_vm() to read
the command line args for non-current task.

Signed-off-by: Suzuki K. Poulose <suz...@in.ibm.com>
---
 fs/binfmt_elf.c |   18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c
index 107bbd3..4eee017 100644
--- a/fs/binfmt_elf.c
+++ b/fs/binfmt_elf.c
@@ -1222,9 +1222,21 @@ static int fill_psinfo(struct elf_prpsinfo *psinfo, 
struct task_struct *p,
        len = mm->arg_end - mm->arg_start;
        if (len >= ELF_PRARGSZ)
                len = ELF_PRARGSZ-1;
-       if (copy_from_user(&psinfo->pr_psargs,
-                          (const char __user *)mm->arg_start, len))
-               return -EFAULT;
+       /*
+       * If we are dumping core for "another task"
+       * we can't use copy_from_user().
+       */
+       if (p->mm == current->mm) {
+               if (copy_from_user(&psinfo->pr_psargs,
+                               (const char __user *)mm->arg_start, len))
+                       return -EFAULT;
+       } else {
+               int bytes = access_process_vm(p, mm->arg_start,
+                                               &psinfo->pr_psargs, len, 0);
+               if (bytes != len)
+                       return -EFAULT;
+       }
+
        for(i = 0; i < len; i++)
                if (psinfo->pr_psargs[i] == 0)
                        psinfo->pr_psargs[i] = ' ';

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to