diff options
| author | ad <ad@NetBSD.org> | 2008-04-23 13:11:42 +0000 |
|---|---|---|
| committer | ad <ad@NetBSD.org> | 2008-04-23 13:11:42 +0000 |
| commit | d0466d413e2cd47a5db94c22d780294ea154e6d9 (patch) | |
| tree | a4cfe869346411a5cf6fafaa2012a8c04bb6b7a3 /sys/compat/linux | |
| parent | bb0c94d223899cc6adead4256332c8c9d177eaa3 (diff) | |
Tweak locking.
Diffstat (limited to 'sys/compat/linux')
| -rw-r--r-- | sys/compat/linux/common/linux_signal.c | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/sys/compat/linux/common/linux_signal.c b/sys/compat/linux/common/linux_signal.c index f144d9760f7..26f231bc35f 100644 --- a/sys/compat/linux/common/linux_signal.c +++ b/sys/compat/linux/common/linux_signal.c @@ -1,4 +1,4 @@ -/* $NetBSD: linux_signal.c,v 1.58 2007/12/20 23:02:56 dsl Exp $ */ +/* $NetBSD: linux_signal.c,v 1.59 2008/04/23 13:11:42 ad Exp $ */ /*- * Copyright (c) 1995, 1998 The NetBSD Foundation, Inc. @@ -55,7 +55,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: linux_signal.c,v 1.58 2007/12/20 23:02:56 dsl Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux_signal.c,v 1.59 2008/04/23 13:11:42 ad Exp $"); #define COMPAT_LINUX 1 @@ -646,16 +646,19 @@ linux_sys_tgkill(struct lwp *l, const struct linux_sys_tgkill_args *uap, registe return linux_sys_kill(l, &cup, retval); /* We use the PID as the TID, but make sure the group ID is right */ - if ((p = pfind(SCARG(uap, tid))) == NULL) + /* XXX racy */ + mutex_enter(&proclist_lock); + if ((p = p_find(SCARG(uap, tid), PFIND_LOCKED)) == NULL || + p->p_emul != &emul_linux) { + mutex_exit(&proclist_lock); return ESRCH; - - if (p->p_emul != &emul_linux) - return ESRCH; - + } led = p->p_emuldata; - - if (led->s->group_pid != SCARG(uap, tgid)) + if (led->s->group_pid != SCARG(uap, tgid)) { + mutex_exit(&proclist_lock); return ESRCH; + } + mutex_exit(&proclist_lock); return linux_sys_kill(l, &cup, retval); } |
