From 0d5ccb45d8a32f2097b0c39555797d3db10b8fab Mon Sep 17 00:00:00 2001 From: Jilles Tjoelker Date: Tue, 18 Jan 2011 21:18:31 +0000 Subject: [PATCH] sh: Fix signal messages being sent to the wrong file sometimes. When a foreground job exits on a signal, a message is printed to stdout about this. The buffer was not flushed after this which could result in the message being written to the wrong file if the next command was a builtin and had stdout redirected. Example: sh -c 'kill -9 $$'; : > foo; echo FOO:; cat foo Reported by: gcooper MFC after: 1 week --- bin/sh/jobs.c | 1 + tools/regression/bin/sh/execution/killed1.0 | 8 ++++++++ 2 files changed, 9 insertions(+) create mode 100644 tools/regression/bin/sh/execution/killed1.0 diff --git a/bin/sh/jobs.c b/bin/sh/jobs.c index fda167b0cfa2..ea8c8f809909 100644 --- a/bin/sh/jobs.c +++ b/bin/sh/jobs.c @@ -1062,6 +1062,7 @@ dowait(int block, struct job *job) if (coredump) out1str(" (core dumped)"); out1c('\n'); + flushout(out1); } } else { TRACE(("Not printing status, rootshell=%d, job=%p\n", rootshell, job)); diff --git a/tools/regression/bin/sh/execution/killed1.0 b/tools/regression/bin/sh/execution/killed1.0 new file mode 100644 index 000000000000..41d3e055723e --- /dev/null +++ b/tools/regression/bin/sh/execution/killed1.0 @@ -0,0 +1,8 @@ +# $FreeBSD$ +# Sometimes the "Killed" message is not flushed soon enough and it +# is redirected along with the output of a builtin. +# Do not change the semicolon to a newline as it would hide the bug. + +exec 3>&1 +exec >/dev/null 2>&1 +${SH} -c 'kill -9 $$'; : >&3 2>&3