[PATCH] pid: Fix mips irix emulation pid usage

2007-12-05 Thread Eric W. Biederman

Signed-off-by: Eric W. Biederman <[EMAIL PROTECTED]>
---
 arch/mips/kernel/irixelf.c |   14 +++---
 arch/mips/kernel/irixsig.c |   16 ++--
 arch/mips/kernel/sysirix.c |   12 ++--
 3 files changed, 23 insertions(+), 19 deletions(-)

diff --git a/arch/mips/kernel/irixelf.c b/arch/mips/kernel/irixelf.c
index 7852c7c..290d8e3 100644
--- a/arch/mips/kernel/irixelf.c
+++ b/arch/mips/kernel/irixelf.c
@@ -591,9 +591,9 @@ static void irix_map_prda_page(void)
return;
 
pp = (struct prda *) v;
-   pp->prda_sys.t_pid  = current->pid;
+   pp->prda_sys.t_pid  = task_pid_vnr(current);
pp->prda_sys.t_prid = read_c0_prid();
-   pp->prda_sys.t_rpid = current->pid;
+   pp->prda_sys.t_rpid = task_pid_vnr(current);
 
/* We leave the rest set to zero */
 }
@@ -1170,11 +1170,11 @@ static int irix_core_dump(long signr, struct pt_regs 
*regs, struct file *file, u
prstatus.pr_info.si_signo = prstatus.pr_cursig = signr;
prstatus.pr_sigpend = current->pending.signal.sig[0];
prstatus.pr_sighold = current->blocked.sig[0];
-   psinfo.pr_pid = prstatus.pr_pid = current->pid;
-   psinfo.pr_ppid = prstatus.pr_ppid = current->parent->pid;
-   psinfo.pr_pgrp = prstatus.pr_pgrp = task_pgrp_nr(current);
-   psinfo.pr_sid = prstatus.pr_sid = task_session_nr(current);
-   if (current->pid == current->tgid) {
+   psinfo.pr_pid = prstatus.pr_pid = task_pid_vnr(current);
+   psinfo.pr_ppid = prstatus.pr_ppid = task_pid_vnr(current->parent);
+   psinfo.pr_pgrp = prstatus.pr_pgrp = task_pgrp_vnr(current);
+   psinfo.pr_sid = prstatus.pr_sid = task_session_vnr(current);
+   if (thread_group_leader(current)) {
/*
 * This is the record for the group leader.  Add in the
 * cumulative times of previous dead threads.  This total
diff --git a/arch/mips/kernel/irixsig.c b/arch/mips/kernel/irixsig.c
index 5b10ac1..0215c80 100644
--- a/arch/mips/kernel/irixsig.c
+++ b/arch/mips/kernel/irixsig.c
@@ -578,10 +578,11 @@ out:
 
 #define W_MASK  (W_EXITED | W_TRAPPED | W_STOPPED | W_CONT | W_NOHANG)
 
-asmlinkage int irix_waitsys(int type, int pid,
+asmlinkage int irix_waitsys(int type, int upid,
struct irix5_siginfo __user *info, int options,
struct rusage __user *ru)
 {
+   struct pid *pid = NULL;
int flag, retval;
DECLARE_WAITQUEUE(wait, current);
struct task_struct *tsk;
@@ -604,6 +605,8 @@ asmlinkage int irix_waitsys(int type, int pid,
if (type != IRIX_P_PID && type != IRIX_P_PGID && type != IRIX_P_ALL)
return -EINVAL;
 
+   if (type != IRIX_P_ALL)
+   pid = find_get_pid(upid);
add_wait_queue(>signal->wait_chldexit, );
 repeat:
flag = 0;
@@ -612,9 +615,9 @@ repeat:
tsk = current;
list_for_each(_p, >children) {
p = list_entry(_p, struct task_struct, sibling);
-   if ((type == IRIX_P_PID) && p->pid != pid)
+   if ((type == IRIX_P_PID) && task_pid(p) != pid)
continue;
-   if ((type == IRIX_P_PGID) && task_pgrp_nr(p) != pid)
+   if ((type == IRIX_P_PGID) && task_pgrp(p) != pid)
continue;
if ((p->exit_signal != SIGCHLD))
continue;
@@ -639,7 +642,7 @@ repeat:
 
retval = __put_user(SIGCHLD, >sig);
retval |= __put_user(0, >code);
-   retval |= __put_user(p->pid, >stuff.procinfo.pid);
+   retval |= __put_user(task_pid_vnr(p), 
>stuff.procinfo.pid);
retval |= __put_user((p->exit_code >> 8) & 0xff,
   >stuff.procinfo.procdata.child.status);
retval |= __put_user(p->utime, 
>stuff.procinfo.procdata.child.utime);
@@ -657,7 +660,7 @@ repeat:
getrusage(p, RUSAGE_BOTH, ru);
retval = __put_user(SIGCHLD, >sig);
retval |= __put_user(1, >code);  /* 
CLD_EXITED */
-   retval |= __put_user(p->pid, >stuff.procinfo.pid);
+   retval |= __put_user(task_pid_vnr(p), 
>stuff.procinfo.pid);
retval |= __put_user((p->exit_code >> 8) & 0xff,
   >stuff.procinfo.procdata.child.status);
retval |= __put_user(p->utime,
@@ -665,7 +668,7 @@ repeat:
retval |= __put_user(p->stime,
   >stuff.procinfo.procdata.child.stime);
if (retval)
-   return retval;
+   goto end_waitsys;
 
if (p->real_parent != p->parent) {
write_lock_irq(_lock);
@@ -698,6 +701,7 @@ repeat:
 end_waitsys:

[PATCH] pid: Fix mips irix emulation pid usage

2007-12-05 Thread Eric W. Biederman

Signed-off-by: Eric W. Biederman [EMAIL PROTECTED]
---
 arch/mips/kernel/irixelf.c |   14 +++---
 arch/mips/kernel/irixsig.c |   16 ++--
 arch/mips/kernel/sysirix.c |   12 ++--
 3 files changed, 23 insertions(+), 19 deletions(-)

diff --git a/arch/mips/kernel/irixelf.c b/arch/mips/kernel/irixelf.c
index 7852c7c..290d8e3 100644
--- a/arch/mips/kernel/irixelf.c
+++ b/arch/mips/kernel/irixelf.c
@@ -591,9 +591,9 @@ static void irix_map_prda_page(void)
return;
 
pp = (struct prda *) v;
-   pp-prda_sys.t_pid  = current-pid;
+   pp-prda_sys.t_pid  = task_pid_vnr(current);
pp-prda_sys.t_prid = read_c0_prid();
-   pp-prda_sys.t_rpid = current-pid;
+   pp-prda_sys.t_rpid = task_pid_vnr(current);
 
/* We leave the rest set to zero */
 }
@@ -1170,11 +1170,11 @@ static int irix_core_dump(long signr, struct pt_regs 
*regs, struct file *file, u
prstatus.pr_info.si_signo = prstatus.pr_cursig = signr;
prstatus.pr_sigpend = current-pending.signal.sig[0];
prstatus.pr_sighold = current-blocked.sig[0];
-   psinfo.pr_pid = prstatus.pr_pid = current-pid;
-   psinfo.pr_ppid = prstatus.pr_ppid = current-parent-pid;
-   psinfo.pr_pgrp = prstatus.pr_pgrp = task_pgrp_nr(current);
-   psinfo.pr_sid = prstatus.pr_sid = task_session_nr(current);
-   if (current-pid == current-tgid) {
+   psinfo.pr_pid = prstatus.pr_pid = task_pid_vnr(current);
+   psinfo.pr_ppid = prstatus.pr_ppid = task_pid_vnr(current-parent);
+   psinfo.pr_pgrp = prstatus.pr_pgrp = task_pgrp_vnr(current);
+   psinfo.pr_sid = prstatus.pr_sid = task_session_vnr(current);
+   if (thread_group_leader(current)) {
/*
 * This is the record for the group leader.  Add in the
 * cumulative times of previous dead threads.  This total
diff --git a/arch/mips/kernel/irixsig.c b/arch/mips/kernel/irixsig.c
index 5b10ac1..0215c80 100644
--- a/arch/mips/kernel/irixsig.c
+++ b/arch/mips/kernel/irixsig.c
@@ -578,10 +578,11 @@ out:
 
 #define W_MASK  (W_EXITED | W_TRAPPED | W_STOPPED | W_CONT | W_NOHANG)
 
-asmlinkage int irix_waitsys(int type, int pid,
+asmlinkage int irix_waitsys(int type, int upid,
struct irix5_siginfo __user *info, int options,
struct rusage __user *ru)
 {
+   struct pid *pid = NULL;
int flag, retval;
DECLARE_WAITQUEUE(wait, current);
struct task_struct *tsk;
@@ -604,6 +605,8 @@ asmlinkage int irix_waitsys(int type, int pid,
if (type != IRIX_P_PID  type != IRIX_P_PGID  type != IRIX_P_ALL)
return -EINVAL;
 
+   if (type != IRIX_P_ALL)
+   pid = find_get_pid(upid);
add_wait_queue(current-signal-wait_chldexit, wait);
 repeat:
flag = 0;
@@ -612,9 +615,9 @@ repeat:
tsk = current;
list_for_each(_p, tsk-children) {
p = list_entry(_p, struct task_struct, sibling);
-   if ((type == IRIX_P_PID)  p-pid != pid)
+   if ((type == IRIX_P_PID)  task_pid(p) != pid)
continue;
-   if ((type == IRIX_P_PGID)  task_pgrp_nr(p) != pid)
+   if ((type == IRIX_P_PGID)  task_pgrp(p) != pid)
continue;
if ((p-exit_signal != SIGCHLD))
continue;
@@ -639,7 +642,7 @@ repeat:
 
retval = __put_user(SIGCHLD, info-sig);
retval |= __put_user(0, info-code);
-   retval |= __put_user(p-pid, info-stuff.procinfo.pid);
+   retval |= __put_user(task_pid_vnr(p), 
info-stuff.procinfo.pid);
retval |= __put_user((p-exit_code  8)  0xff,
   info-stuff.procinfo.procdata.child.status);
retval |= __put_user(p-utime, 
info-stuff.procinfo.procdata.child.utime);
@@ -657,7 +660,7 @@ repeat:
getrusage(p, RUSAGE_BOTH, ru);
retval = __put_user(SIGCHLD, info-sig);
retval |= __put_user(1, info-code);  /* 
CLD_EXITED */
-   retval |= __put_user(p-pid, info-stuff.procinfo.pid);
+   retval |= __put_user(task_pid_vnr(p), 
info-stuff.procinfo.pid);
retval |= __put_user((p-exit_code  8)  0xff,
   info-stuff.procinfo.procdata.child.status);
retval |= __put_user(p-utime,
@@ -665,7 +668,7 @@ repeat:
retval |= __put_user(p-stime,
   info-stuff.procinfo.procdata.child.stime);
if (retval)
-   return retval;
+   goto end_waitsys;
 
if (p-real_parent != p-parent) {
write_lock_irq(tasklist_lock);
@@ -698,6 +701,7 @@ repeat: