Module Name: src Committed By: martin Date: Wed Aug 7 10:11:45 UTC 2024
Modified Files: src/lib/libc/compat-43 [netbsd-9]: killpg.c src/sys/kern [netbsd-9]: kern_descrip.c kern_ktrace.c kern_proc.c sys_sig.c tty.c src/tests/lib/libc/sys [netbsd-9]: t_kill.c Log Message: Pull up following revision(s) (requested by kre in ticket #1859): sys/kern/kern_proc.c: revision 1.276 (via patch) sys/kern/kern_ktrace.c: revision 1.185 (via patch) sys/kern/sys_sig.c: revision 1.58 (via patch) sys/kern/kern_descrip.c: revision 1.263 (via patch) lib/libc/compat-43/killpg.c: revision 1.10 sys/kern/tty.c: revision 1.313 (via patch) tests/lib/libc/sys/t_kill.c: revision 1.2 PR kern/58425 -- Disallow INT_MIN as a (negative) pid arg. Since -INT_MIN is undefined, and to point of negative pid args is to negate them, and use the result as a pgrp id instead, we need to avoid accidentally negating INT_MIN. Since pid_t is just an integral type, of unspecified width, when testing pid_t value test for <= INT_MIN (or > INT_MIN sometimes) rather than == INT_MIN. When testing int values, just == INT_MIN is all that is needed, < INT_MIN cannot occur. tests/lib/libc/sys/t_kill: Test kill(INT_MIN, ...) fails with ESRCH. PR kern/58425 To generate a diff of this commit: cvs rdiff -u -r1.9 -r1.9.6.1 src/lib/libc/compat-43/killpg.c cvs rdiff -u -r1.243 -r1.243.4.1 src/sys/kern/kern_descrip.c cvs rdiff -u -r1.173 -r1.173.4.1 src/sys/kern/kern_ktrace.c cvs rdiff -u -r1.233.2.1 -r1.233.2.2 src/sys/kern/kern_proc.c cvs rdiff -u -r1.47.4.3 -r1.47.4.4 src/sys/kern/sys_sig.c cvs rdiff -u -r1.281 -r1.281.4.1 src/sys/kern/tty.c cvs rdiff -u -r1.1 -r1.1.44.1 src/tests/lib/libc/sys/t_kill.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/lib/libc/compat-43/killpg.c diff -u src/lib/libc/compat-43/killpg.c:1.9 src/lib/libc/compat-43/killpg.c:1.9.6.1 --- src/lib/libc/compat-43/killpg.c:1.9 Thu Jan 4 20:57:28 2018 +++ src/lib/libc/compat-43/killpg.c Wed Aug 7 10:11:45 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: killpg.c,v 1.9 2018/01/04 20:57:28 kamil Exp $ */ +/* $NetBSD: killpg.c,v 1.9.6.1 2024/08/07 10:11:45 martin Exp $ */ /* * Copyright (c) 1989, 1993 @@ -34,7 +34,7 @@ #if 0 static char sccsid[] = "@(#)killpg.c 8.1 (Berkeley) 6/2/93"; #else -__RCSID("$NetBSD: killpg.c,v 1.9 2018/01/04 20:57:28 kamil Exp $"); +__RCSID("$NetBSD: killpg.c,v 1.9.6.1 2024/08/07 10:11:45 martin Exp $"); #endif #endif /* LIBC_SCCS and not lint */ @@ -43,6 +43,7 @@ __RCSID("$NetBSD: killpg.c,v 1.9 2018/01 #include <sys/types.h> #include <signal.h> #include <errno.h> +#include <limits.h> /* * Backwards-compatible killpg(). @@ -50,7 +51,7 @@ __RCSID("$NetBSD: killpg.c,v 1.9 2018/01 int killpg(pid_t pgid, int sig) { - if (pgid == 1) { + if (pgid == 1 || pgid <= INT_MIN) { errno = ESRCH; return (-1); } Index: src/sys/kern/kern_descrip.c diff -u src/sys/kern/kern_descrip.c:1.243 src/sys/kern/kern_descrip.c:1.243.4.1 --- src/sys/kern/kern_descrip.c:1.243 Wed Feb 20 19:42:14 2019 +++ src/sys/kern/kern_descrip.c Wed Aug 7 10:11:45 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_descrip.c,v 1.243 2019/02/20 19:42:14 christos Exp $ */ +/* $NetBSD: kern_descrip.c,v 1.243.4.1 2024/08/07 10:11:45 martin Exp $ */ /*- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -70,7 +70,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: kern_descrip.c,v 1.243 2019/02/20 19:42:14 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_descrip.c,v 1.243.4.1 2024/08/07 10:11:45 martin Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -1765,6 +1765,9 @@ fsetown(pid_t *pgid, u_long cmd, const v pid_t id = *(const pid_t *)data; int error; + if (id <= INT_MIN) + return EINVAL; + switch (cmd) { case TIOCSPGRP: if (id < 0) @@ -1811,6 +1814,7 @@ fgetown(pid_t pgid, u_long cmd, void *da switch (cmd) { case TIOCGPGRP: + KASSERT(pgid > INT_MIN); *(int *)data = -pgid; break; default: @@ -1850,7 +1854,7 @@ fownsignal(pid_t pgid, int signo, int co } else { struct pgrp *pgrp; - KASSERT(pgid < 0); + KASSERT(pgid < 0 && pgid > INT_MIN); pgrp = pgrp_find(-pgid); if (pgrp != NULL) { kpgsignal(pgrp, &ksi, fdescdata, 0); Index: src/sys/kern/kern_ktrace.c diff -u src/sys/kern/kern_ktrace.c:1.173 src/sys/kern/kern_ktrace.c:1.173.4.1 --- src/sys/kern/kern_ktrace.c:1.173 Mon Sep 3 16:29:35 2018 +++ src/sys/kern/kern_ktrace.c Wed Aug 7 10:11:45 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_ktrace.c,v 1.173 2018/09/03 16:29:35 riastradh Exp $ */ +/* $NetBSD: kern_ktrace.c,v 1.173.4.1 2024/08/07 10:11:45 martin Exp $ */ /*- * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc. @@ -61,7 +61,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: kern_ktrace.c,v 1.173 2018/09/03 16:29:35 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_ktrace.c,v 1.173.4.1 2024/08/07 10:11:45 martin Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -1088,7 +1088,10 @@ ktrace_common(lwp_t *curl, int ops, int /* * by process group */ - pg = pgrp_find(-pid); + if (pid == INT_MIN) + pg = NULL; + else + pg = pgrp_find(-pid); if (pg == NULL) error = ESRCH; else { Index: src/sys/kern/kern_proc.c diff -u src/sys/kern/kern_proc.c:1.233.2.1 src/sys/kern/kern_proc.c:1.233.2.2 --- src/sys/kern/kern_proc.c:1.233.2.1 Tue Aug 6 16:16:55 2019 +++ src/sys/kern/kern_proc.c Wed Aug 7 10:11:44 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_proc.c,v 1.233.2.1 2019/08/06 16:16:55 martin Exp $ */ +/* $NetBSD: kern_proc.c,v 1.233.2.2 2024/08/07 10:11:44 martin Exp $ */ /*- * Copyright (c) 1999, 2006, 2007, 2008 The NetBSD Foundation, Inc. @@ -62,7 +62,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: kern_proc.c,v 1.233.2.1 2019/08/06 16:16:55 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_proc.c,v 1.233.2.2 2024/08/07 10:11:44 martin Exp $"); #ifdef _KERNEL_OPT #include "opt_kstack.h" @@ -578,6 +578,9 @@ pgid_in_session(struct proc *p, pid_t pg struct session *session; int error; + if (pg_id <= INT_MIN) + return EINVAL; + mutex_enter(proc_lock); if (pg_id < 0) { struct proc *p1 = proc_find(-pg_id); Index: src/sys/kern/sys_sig.c diff -u src/sys/kern/sys_sig.c:1.47.4.3 src/sys/kern/sys_sig.c:1.47.4.4 --- src/sys/kern/sys_sig.c:1.47.4.3 Mon Nov 11 17:11:07 2019 +++ src/sys/kern/sys_sig.c Wed Aug 7 10:11:45 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: sys_sig.c,v 1.47.4.3 2019/11/11 17:11:07 martin Exp $ */ +/* $NetBSD: sys_sig.c,v 1.47.4.4 2024/08/07 10:11:45 martin Exp $ */ /*- * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc. @@ -66,7 +66,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sys_sig.c,v 1.47.4.3 2019/11/11 17:11:07 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sys_sig.c,v 1.47.4.4 2024/08/07 10:11:45 martin Exp $"); #include "opt_dtrace.h" @@ -272,6 +272,8 @@ kill1(struct lwp *l, pid_t pid, ksiginfo case 0: /* signal own process group */ return killpg1(l, ksi, 0, 0); default: /* negative explicit process group */ + if (pid <= INT_MIN) + return ESRCH; return killpg1(l, ksi, -pid, 0); } /* NOTREACHED */ Index: src/sys/kern/tty.c diff -u src/sys/kern/tty.c:1.281 src/sys/kern/tty.c:1.281.4.1 --- src/sys/kern/tty.c:1.281 Fri Mar 1 11:06:57 2019 +++ src/sys/kern/tty.c Wed Aug 7 10:11:45 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: tty.c,v 1.281 2019/03/01 11:06:57 pgoyette Exp $ */ +/* $NetBSD: tty.c,v 1.281.4.1 2024/08/07 10:11:45 martin Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -63,7 +63,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: tty.c,v 1.281 2019/03/01 11:06:57 pgoyette Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tty.c,v 1.281.4.1 2024/08/07 10:11:45 martin Exp $"); #ifdef _KERNEL_OPT #include "opt_compat_netbsd.h" @@ -1302,6 +1302,10 @@ ttioctl(struct tty *tp, u_long cmd, void } if (pgid < 0) { + if (pgid <= INT_MIN) { + mutex_exit(proc_lock); + return (EINVAL); + } pgrp = pgrp_find(-pgid); if (pgrp == NULL) { mutex_exit(proc_lock); Index: src/tests/lib/libc/sys/t_kill.c diff -u src/tests/lib/libc/sys/t_kill.c:1.1 src/tests/lib/libc/sys/t_kill.c:1.1.44.1 --- src/tests/lib/libc/sys/t_kill.c:1.1 Thu Jul 7 06:57:53 2011 +++ src/tests/lib/libc/sys/t_kill.c Wed Aug 7 10:11:45 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: t_kill.c,v 1.1 2011/07/07 06:57:53 jruoho Exp $ */ +/* $NetBSD: t_kill.c,v 1.1.44.1 2024/08/07 10:11:45 martin Exp $ */ /*- * Copyright (c) 2011 The NetBSD Foundation, Inc. @@ -29,7 +29,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ #include <sys/cdefs.h> -__RCSID("$NetBSD: t_kill.c,v 1.1 2011/07/07 06:57:53 jruoho Exp $"); +__RCSID("$NetBSD: t_kill.c,v 1.1.44.1 2024/08/07 10:11:45 martin Exp $"); #include <sys/wait.h> @@ -299,6 +299,18 @@ ATF_TC_BODY(kill_pgrp_zero, tc) atf_tc_fail("failed to kill(2) a process group"); } +ATF_TC(kill_int_min); +ATF_TC_HEAD(kill_int_min, tc) +{ + atf_tc_set_md_var(tc, "descr", "Test kill(INT_MIN) fails with ESRCH"); +} + +ATF_TC_BODY(kill_int_min, tc) +{ + + ATF_CHECK_ERRNO(ESRCH, kill(INT_MIN, 0)); +} + ATF_TP_ADD_TCS(tp) { @@ -307,6 +319,7 @@ ATF_TP_ADD_TCS(tp) ATF_TP_ADD_TC(tp, kill_perm); ATF_TP_ADD_TC(tp, kill_pgrp_neg); ATF_TP_ADD_TC(tp, kill_pgrp_zero); + ATF_TP_ADD_TC(tp, kill_int_min); return atf_no_error(); }