summaryrefslogtreecommitdiff
path: root/sys/compat/linux
diff options
context:
space:
mode:
authorad <ad@NetBSD.org>2008-04-23 13:11:42 +0000
committerad <ad@NetBSD.org>2008-04-23 13:11:42 +0000
commitd0466d413e2cd47a5db94c22d780294ea154e6d9 (patch)
treea4cfe869346411a5cf6fafaa2012a8c04bb6b7a3 /sys/compat/linux
parentbb0c94d223899cc6adead4256332c8c9d177eaa3 (diff)
Tweak locking.
Diffstat (limited to 'sys/compat/linux')
-rw-r--r--sys/compat/linux/common/linux_signal.c21
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);
}