summaryrefslogtreecommitdiffstats
path: root/bin
diff options
context:
space:
mode:
authorjilles <jilles@FreeBSD.org>2014-03-08 19:44:34 +0000
committerjilles <jilles@FreeBSD.org>2014-03-08 19:44:34 +0000
commit6139448a8684c288eb32e0763ef20749ab495847 (patch)
treedbd858bb77071b4170dbaa3bc3218ea399c009c1 /bin
parent8dfc245ef95431f18412d2103ec22f44917d1805 (diff)
downloadFreeBSD-src-6139448a8684c288eb32e0763ef20749ab495847.zip
FreeBSD-src-6139448a8684c288eb32e0763ef20749ab495847.tar.gz
sh: Successfully do nothing when killing a terminated job.
If a job has terminated but is still known, silently do nothing when using the kill builtin with the job specifier. Formerly, the shell called kill() with the process group ID that might have been reused.
Diffstat (limited to 'bin')
-rw-r--r--bin/kill/kill.c10
-rw-r--r--bin/sh/jobs.c2
-rw-r--r--bin/sh/tests/builtins/Makefile1
-rw-r--r--bin/sh/tests/builtins/kill1.08
4 files changed, 19 insertions, 2 deletions
diff --git a/bin/kill/kill.c b/bin/kill/kill.c
index 2d41f78..ab1701e 100644
--- a/bin/kill/kill.c
+++ b/bin/kill/kill.c
@@ -133,9 +133,15 @@ main(int argc, char *argv[])
for (errors = 0; argc; argc--, argv++) {
#ifdef SHELL
- if (**argv == '%')
+ if (**argv == '%') {
pid = getjobpgrp(*argv);
- else
+ /*
+ * Silently ignore terminated jobs, like the kernel
+ * silently ignores zombies.
+ */
+ if (pid == 0)
+ continue;
+ } else
#endif
{
pid = strtol(*argv, &ep, 10);
diff --git a/bin/sh/jobs.c b/bin/sh/jobs.c
index 1c0c6bd..6e7791c 100644
--- a/bin/sh/jobs.c
+++ b/bin/sh/jobs.c
@@ -645,6 +645,8 @@ getjobpgrp(char *name)
struct job *jp;
jp = getjob(name);
+ if (jp->state == JOBDONE)
+ return 0;
return -jp->ps[0].pid;
}
diff --git a/bin/sh/tests/builtins/Makefile b/bin/sh/tests/builtins/Makefile
index 6f60f84..b76d631 100644
--- a/bin/sh/tests/builtins/Makefile
+++ b/bin/sh/tests/builtins/Makefile
@@ -86,6 +86,7 @@ FILES+= hash3.0 hash3.0.stdout
FILES+= hash4.0
FILES+= jobid1.0
FILES+= jobid2.0
+FILES+= kill1.0
FILES+= lineno.0 lineno.0.stdout
FILES+= lineno2.0
FILES+= local1.0
diff --git a/bin/sh/tests/builtins/kill1.0 b/bin/sh/tests/builtins/kill1.0
new file mode 100644
index 0000000..c1b8550
--- /dev/null
+++ b/bin/sh/tests/builtins/kill1.0
@@ -0,0 +1,8 @@
+# $FreeBSD$
+
+: &
+p1=$!
+: &
+p2=$!
+wait $p2
+kill %1
OpenPOWER on IntegriCloud