aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2008-02-08 07:19:16 -0500
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2008-02-08 12:22:28 -0500
commit69440e76f6121fe7a5193a82f45ccec08e4bb24b (patch)
tree1a573c55bbcb8d8d83f7a21551ca08c6ac35dfe8
parentac9a8e3f0f43d20fc316162e8e5f9186d295ff49 (diff)
pid: fix mips irix emulation pid usage
[m.kozlowski@tuxland.pl: fix unbalanced parenthesis in irix_BSDsetpgrp()] Signed-off-by: Eric W. Biederman <ebiederm@xmission.com> Cc: Pavel Emelyanov <xemul@openvz.org> Cc: Oleg Nesterov <oleg@tv-sign.ru> Cc: Ralf Baechle <ralf@linux-mips.org> Signed-off-by: Mariusz Kozlowski <m.kozlowski@tuxland.pl> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--arch/mips/kernel/irixelf.c14
-rw-r--r--arch/mips/kernel/irixsig.c16
-rw-r--r--arch/mips/kernel/sysirix.c12
3 files changed, 23 insertions, 19 deletions
diff --git a/arch/mips/kernel/irixelf.c b/arch/mips/kernel/irixelf.c
index 7852c7cdf29e..290d8e3a664d 100644
--- a/arch/mips/kernel/irixelf.c
+++ b/arch/mips/kernel/irixelf.c
@@ -591,9 +591,9 @@ static void irix_map_prda_page(void)
591 return; 591 return;
592 592
593 pp = (struct prda *) v; 593 pp = (struct prda *) v;
594 pp->prda_sys.t_pid = current->pid; 594 pp->prda_sys.t_pid = task_pid_vnr(current);
595 pp->prda_sys.t_prid = read_c0_prid(); 595 pp->prda_sys.t_prid = read_c0_prid();
596 pp->prda_sys.t_rpid = current->pid; 596 pp->prda_sys.t_rpid = task_pid_vnr(current);
597 597
598 /* We leave the rest set to zero */ 598 /* We leave the rest set to zero */
599} 599}
@@ -1170,11 +1170,11 @@ static int irix_core_dump(long signr, struct pt_regs *regs, struct file *file, u
1170 prstatus.pr_info.si_signo = prstatus.pr_cursig = signr; 1170 prstatus.pr_info.si_signo = prstatus.pr_cursig = signr;
1171 prstatus.pr_sigpend = current->pending.signal.sig[0]; 1171 prstatus.pr_sigpend = current->pending.signal.sig[0];
1172 prstatus.pr_sighold = current->blocked.sig[0]; 1172 prstatus.pr_sighold = current->blocked.sig[0];
1173 psinfo.pr_pid = prstatus.pr_pid = current->pid; 1173 psinfo.pr_pid = prstatus.pr_pid = task_pid_vnr(current);
1174 psinfo.pr_ppid = prstatus.pr_ppid = current->parent->pid; 1174 psinfo.pr_ppid = prstatus.pr_ppid = task_pid_vnr(current->parent);
1175 psinfo.pr_pgrp = prstatus.pr_pgrp = task_pgrp_nr(current); 1175 psinfo.pr_pgrp = prstatus.pr_pgrp = task_pgrp_vnr(current);
1176 psinfo.pr_sid = prstatus.pr_sid = task_session_nr(current); 1176 psinfo.pr_sid = prstatus.pr_sid = task_session_vnr(current);
1177 if (current->pid == current->tgid) { 1177 if (thread_group_leader(current)) {
1178 /* 1178 /*
1179 * This is the record for the group leader. Add in the 1179 * This is the record for the group leader. Add in the
1180 * cumulative times of previous dead threads. This total 1180 * cumulative times of previous dead threads. This total
diff --git a/arch/mips/kernel/irixsig.c b/arch/mips/kernel/irixsig.c
index 5b10ac133ec8..0215c805a592 100644
--- a/arch/mips/kernel/irixsig.c
+++ b/arch/mips/kernel/irixsig.c
@@ -578,10 +578,11 @@ out:
578 578
579#define W_MASK (W_EXITED | W_TRAPPED | W_STOPPED | W_CONT | W_NOHANG) 579#define W_MASK (W_EXITED | W_TRAPPED | W_STOPPED | W_CONT | W_NOHANG)
580 580
581asmlinkage int irix_waitsys(int type, int pid, 581asmlinkage int irix_waitsys(int type, int upid,
582 struct irix5_siginfo __user *info, int options, 582 struct irix5_siginfo __user *info, int options,
583 struct rusage __user *ru) 583 struct rusage __user *ru)
584{ 584{
585 struct pid *pid = NULL;
585 int flag, retval; 586 int flag, retval;
586 DECLARE_WAITQUEUE(wait, current); 587 DECLARE_WAITQUEUE(wait, current);
587 struct task_struct *tsk; 588 struct task_struct *tsk;
@@ -604,6 +605,8 @@ asmlinkage int irix_waitsys(int type, int pid,
604 if (type != IRIX_P_PID && type != IRIX_P_PGID && type != IRIX_P_ALL) 605 if (type != IRIX_P_PID && type != IRIX_P_PGID && type != IRIX_P_ALL)
605 return -EINVAL; 606 return -EINVAL;
606 607
608 if (type != IRIX_P_ALL)
609 pid = find_get_pid(upid);
607 add_wait_queue(&current->signal->wait_chldexit, &wait); 610 add_wait_queue(&current->signal->wait_chldexit, &wait);
608repeat: 611repeat:
609 flag = 0; 612 flag = 0;
@@ -612,9 +615,9 @@ repeat:
612 tsk = current; 615 tsk = current;
613 list_for_each(_p, &tsk->children) { 616 list_for_each(_p, &tsk->children) {
614 p = list_entry(_p, struct task_struct, sibling); 617 p = list_entry(_p, struct task_struct, sibling);
615 if ((type == IRIX_P_PID) && p->pid != pid) 618 if ((type == IRIX_P_PID) && task_pid(p) != pid)
616 continue; 619 continue;
617 if ((type == IRIX_P_PGID) && task_pgrp_nr(p) != pid) 620 if ((type == IRIX_P_PGID) && task_pgrp(p) != pid)
618 continue; 621 continue;
619 if ((p->exit_signal != SIGCHLD)) 622 if ((p->exit_signal != SIGCHLD))
620 continue; 623 continue;
@@ -639,7 +642,7 @@ repeat:
639 642
640 retval = __put_user(SIGCHLD, &info->sig); 643 retval = __put_user(SIGCHLD, &info->sig);
641 retval |= __put_user(0, &info->code); 644 retval |= __put_user(0, &info->code);
642 retval |= __put_user(p->pid, &info->stuff.procinfo.pid); 645 retval |= __put_user(task_pid_vnr(p), &info->stuff.procinfo.pid);
643 retval |= __put_user((p->exit_code >> 8) & 0xff, 646 retval |= __put_user((p->exit_code >> 8) & 0xff,
644 &info->stuff.procinfo.procdata.child.status); 647 &info->stuff.procinfo.procdata.child.status);
645 retval |= __put_user(p->utime, &info->stuff.procinfo.procdata.child.utime); 648 retval |= __put_user(p->utime, &info->stuff.procinfo.procdata.child.utime);
@@ -657,7 +660,7 @@ repeat:
657 getrusage(p, RUSAGE_BOTH, ru); 660 getrusage(p, RUSAGE_BOTH, ru);
658 retval = __put_user(SIGCHLD, &info->sig); 661 retval = __put_user(SIGCHLD, &info->sig);
659 retval |= __put_user(1, &info->code); /* CLD_EXITED */ 662 retval |= __put_user(1, &info->code); /* CLD_EXITED */
660 retval |= __put_user(p->pid, &info->stuff.procinfo.pid); 663 retval |= __put_user(task_pid_vnr(p), &info->stuff.procinfo.pid);
661 retval |= __put_user((p->exit_code >> 8) & 0xff, 664 retval |= __put_user((p->exit_code >> 8) & 0xff,
662 &info->stuff.procinfo.procdata.child.status); 665 &info->stuff.procinfo.procdata.child.status);
663 retval |= __put_user(p->utime, 666 retval |= __put_user(p->utime,
@@ -665,7 +668,7 @@ repeat:
665 retval |= __put_user(p->stime, 668 retval |= __put_user(p->stime,
666 &info->stuff.procinfo.procdata.child.stime); 669 &info->stuff.procinfo.procdata.child.stime);
667 if (retval) 670 if (retval)
668 return retval; 671 goto end_waitsys;
669 672
670 if (p->real_parent != p->parent) { 673 if (p->real_parent != p->parent) {
671 write_lock_irq(&tasklist_lock); 674 write_lock_irq(&tasklist_lock);
@@ -698,6 +701,7 @@ repeat:
698end_waitsys: 701end_waitsys:
699 current->state = TASK_RUNNING; 702 current->state = TASK_RUNNING;
700 remove_wait_queue(&current->signal->wait_chldexit, &wait); 703 remove_wait_queue(&current->signal->wait_chldexit, &wait);
704 put_pid(pid);
701 705
702 return retval; 706 return retval;
703} 707}
diff --git a/arch/mips/kernel/sysirix.c b/arch/mips/kernel/sysirix.c
index 22fd41e946b2..d70c4e0e85fb 100644
--- a/arch/mips/kernel/sysirix.c
+++ b/arch/mips/kernel/sysirix.c
@@ -582,8 +582,8 @@ out:
582 582
583asmlinkage int irix_getpid(struct pt_regs *regs) 583asmlinkage int irix_getpid(struct pt_regs *regs)
584{ 584{
585 regs->regs[3] = current->real_parent->pid; 585 regs->regs[3] = task_pid_vnr(current->real_parent);
586 return current->pid; 586 return task_pid_vnr(current);
587} 587}
588 588
589asmlinkage int irix_getuid(struct pt_regs *regs) 589asmlinkage int irix_getuid(struct pt_regs *regs)
@@ -763,11 +763,11 @@ asmlinkage int irix_setpgrp(int flags)
763 printk("[%s:%d] setpgrp(%d) ", current->comm, current->pid, flags); 763 printk("[%s:%d] setpgrp(%d) ", current->comm, current->pid, flags);
764#endif 764#endif
765 if(!flags) 765 if(!flags)
766 error = task_pgrp_nr(current); 766 error = task_pgrp_vnr(current);
767 else 767 else
768 error = sys_setsid(); 768 error = sys_setsid();
769#ifdef DEBUG_PROCGRPS 769#ifdef DEBUG_PROCGRPS
770 printk("returning %d\n", task_pgrp_nr(current)); 770 printk("returning %d\n", error);
771#endif 771#endif
772 772
773 return error; 773 return error;
@@ -1093,10 +1093,10 @@ asmlinkage int irix_BSDsetpgrp(int pid, int pgrp)
1093 pid, pgrp); 1093 pid, pgrp);
1094#endif 1094#endif
1095 if(!pid) 1095 if(!pid)
1096 pid = current->pid; 1096 pid = task_pid_vnr(current);
1097 1097
1098 /* Wheee, weird sysv thing... */ 1098 /* Wheee, weird sysv thing... */
1099 if ((pgrp == 0) && (pid == current->pid)) 1099 if ((pgrp == 0) && (pid == task_pid_vnr(current)))
1100 error = sys_setsid(); 1100 error = sys_setsid();
1101 else 1101 else
1102 error = sys_setpgid(pid, pgrp); 1102 error = sys_setpgid(pid, pgrp);