aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJilles Tjoelker <jilles@FreeBSD.org>2014-03-08 19:44:34 +0000
committerJilles Tjoelker <jilles@FreeBSD.org>2014-03-08 19:44:34 +0000
commit4646e82dcddad936e873c591ce5cce0652362c0e (patch)
treedbd858bb77071b4170dbaa3bc3218ea399c009c1
parenta2be2710b4669390d74c224c40ee3bd797690c0a (diff)
downloadsrc-4646e82dcddad936e873c591ce5cce0652362c0e.tar.gz
src-4646e82dcddad936e873c591ce5cce0652362c0e.zip
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.
Notes
Notes: svn path=/head/; revision=262931
-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 2d41f7865e48..ab1701e03bdb 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 1c0c6bd22d21..6e7791c905a4 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 6f60f8493c0e..b76d6312342a 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 000000000000..c1b85503848e
--- /dev/null
+++ b/bin/sh/tests/builtins/kill1.0
@@ -0,0 +1,8 @@
+# $FreeBSD$
+
+: &
+p1=$!
+: &
+p2=$!
+wait $p2
+kill %1