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();
 }

Reply via email to