Module Name:    src
Committed By:   kre
Date:           Sun Aug 30 19:35:10 UTC 2020

Modified Files:
        src/bin/kill: kill.c

Log Message:
Every integer that fits within a pid_t is a potential "pid" arg to kill.
That means we cannot use (pid_t)-1 as an error indicator, as that's a
valid pid to use (described as working in kill(1) - yet it wasn't working
in /bin/kill (nor sh's builtin kill, which is essentially the same code).
This is even required to work by POSIX.

So change processnum() (the parser/validator for the pid args) to take
a pointer to a pid_t and return the pid that way, leaving the return value
of the (now int) function to indicate just ok/error.  While here, fix
the validation a little ('' is no longer an accepted alias for 0) and in
case of an error from kill(2) have the error message indicate whether the
kill was targeted at a pid of a pgrp.


To generate a diff of this commit:
cvs rdiff -u -r1.31 -r1.32 src/bin/kill/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/bin/kill/kill.c
diff -u src/bin/kill/kill.c:1.31 src/bin/kill/kill.c:1.32
--- src/bin/kill/kill.c:1.31	Sun Aug 30 16:10:40 2020
+++ src/bin/kill/kill.c	Sun Aug 30 19:35:09 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: kill.c,v 1.31 2020/08/30 16:10:40 kre Exp $ */
+/* $NetBSD: kill.c,v 1.32 2020/08/30 19:35:09 kre Exp $ */
 
 /*
  * Copyright (c) 1988, 1993, 1994
@@ -39,7 +39,7 @@ __COPYRIGHT("@(#) Copyright (c) 1988, 19
 #if 0
 static char sccsid[] = "@(#)kill.c	8.4 (Berkeley) 4/28/95";
 #else
-__RCSID("$NetBSD: kill.c,v 1.31 2020/08/30 16:10:40 kre Exp $");
+__RCSID("$NetBSD: kill.c,v 1.32 2020/08/30 19:35:09 kre Exp $");
 #endif
 #endif /* not lint */
 
@@ -66,7 +66,7 @@ int killcmd(int, char *argv[]);
 __dead static void nosig(const char *);
 void printsignals(FILE *, int);
 static int signum(const char *);
-static pid_t processnum(const char *);
+static int processnum(const char *, pid_t *);
 __dead static void usage(void);
 
 int
@@ -177,6 +177,7 @@ main(int argc, char *argv[])
 	for (errors = 0; argc; argc--, argv++) {
 #ifdef SHELL
 		extern int getjobpgrp(const char *);
+
 		if (*argv[0] == '%') {
 			pid = getjobpgrp(*argv);
 			if (pid == 0) {
@@ -186,13 +187,13 @@ main(int argc, char *argv[])
 			}
 		} else 
 #endif
-			if ((pid = processnum(*argv)) == (pid_t)-1) {
+			if (processnum(*argv, &pid) != 0) {
 				errors = 1;
 				continue;
 			}
 
 		if (kill(pid, numsig) == -1) {
-			warn("%s", *argv);
+			warn("%s %s", pid < -1 ? "pgrp" : "pid", *argv);
 			errors = 1;
 		}
 #ifdef SHELL
@@ -226,22 +227,24 @@ signum(const char *sn)
 	return (int)n;
 }
 
-static pid_t
-processnum(const char *s)
+static int
+processnum(const char *s, pid_t *pid)
 {
 	intmax_t n;
 	char *ep;
 
+	errno = 0;
 	n = strtoimax(s, &ep, 10);
 
 	/* check for correctly parsed number */
-	if (*ep || n == INTMAX_MIN || n == INTMAX_MAX || (pid_t)n != n ||
-	    n == -1) {
-		warnx("illegal process%s id: %s", (n < 0 ? " group" : ""), s);
-		n = -1;
+	if (ep == s || *ep || n == INTMAX_MIN || n == INTMAX_MAX ||
+	    (pid_t)n != n || errno != 0) {
+		warnx("illegal process%s id: '%s'", (n < 0 ? " group" : ""), s);
+		return -1;
 	}
 
-	return (pid_t)n;
+	*pid = (pid_t)n;
+	return 0;
 }
 
 static void

Reply via email to