perf stat: avoid sending SIGTERM to random processes
PATCH 1/1 perf stat: avoid sending SIGTERM to random processes
This patch fixes a problem with perf stat whereby on termination it may send a SIGTERM signal to random processes on systems with high PID recycling. I got some actual bug reports on this.
There is race between the SIGCHLD and sig_atexit() handlers. This patch addresses this problem by clearing child_pid in the SIGCHLD handler.
---
tools/perf/builtin-stat.c +22 -1
@@ -87,7 +87,7 @@ static int run_count = 1;static bool no_inherit = false;static bool scale = true;static enum aggr_mode aggr_mode =AGGR_GLOBAL ; -static pid_t child_pid =-1 ; +static volatile pid_t child_pid =-1 ;static bool null_run = false;static int detailed_run =0 ;static bool big_num = true;
@@ -1148,13 +1148,34 @@ static void skip_signal(int signo) done =1 ; signr = signo; +/* +* render child_pid harmless +* won't send SIGTERM to a random +* process in case of race condition +* and fast PID recycling +*/ + child_pid =-1 ; }static void sig_atexit (void ) { +sigset_t set, oset; + +/* +* avoid race condition with SIGCHLD handler +* in skip_signal() which is modifying child_pid +* goal is to avoid send SIGTERM to a random +* process +*/ +sigemptyset (&set); +sigaddset (&set,SIGCHLD ); +sigprocmask (SIG_BLOCK , &set, &oset); +if (child_pid !=-1 )kill (child_pid,SIGTERM ); +sigprocmask (SIG_SETMASK , &oset,NULL ); +if (signr ==-1 )return ;
Any comment on this patch Arnaldo?
Quoted 60 lines · Stephane Eranian
This patch fixes a problem with perf stat whereby on termination it may send a SIGTERM signal to random processes on systems with high PID recycling. I got some actual bug reports on this.
There is race between the SIGCHLD and
sig_atexit()handlers. This patch addresses this problem by clearingchild_pidin the SIGCHLD handler.Signed-off-by Stephane Eranian <[email protected]>---
tools/perf/builtin-stat.c +22
-1@@ -87,7 +87,7 @@ static int run_count = 1;static bool no_inherit = false;static bool scale = true;static enum aggr_mode aggr_mode =AGGR_GLOBAL ; -static pid_t child_pid =-1 ; +static volatile pid_t child_pid =-1 ;static bool null_run = false;static int detailed_run =0 ;static bool big_num = true;@@ -1148,13 +1148,34 @@ static void skip_signal(int signo) done =1 ; signr = signo; +/* +* render child_pid harmless +* won't send SIGTERM to a random +* process in case of race condition +* and fast PID recycling +*/ + child_pid =-1 ; }static void sig_atexit (void ) { +sigset_t set, oset; + +/* +* avoid race condition with SIGCHLD handler +* in skip_signal() which is modifying child_pid +* goal is to avoid send SIGTERM to a random +* process +*/ +sigemptyset (&set); +sigaddset (&set,SIGCHLD ); +sigprocmask (SIG_BLOCK , &set, &oset); +if (child_pid !=-1 )kill (child_pid,SIGTERM ); +sigprocmask (SIG_SETMASK , &oset,NULL ); +if (signr ==-1 )return ;
tip-bot for Stephane Eranian
merge bot[tip:perf/urgent] perf stat: Avoid sending SIGTERM to random processes
In reply to Stephane Eranianperf stat: Avoid sending SIGTERM to random processes
Commit-ID: d07f0b120642f442d81a61f68a9325fb7717004f Gitweb: http://git.kernel.org/tip/d07f0b120642f442d81a61f68a9325fb7717004f Author: Stephane Eranian <[email protected]> AuthorDate: Tue, 4 Jun 2013 17:44:26 +0200 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 8 Jul 2013 17:36:33 -0300
perf stat: Avoid sending SIGTERM to random processes
This patch fixes a problem with perf stat whereby on termination it may send a SIGTERM signal to random processes on systems with high PID recycling. I got some actual bug reports on this.
There is race between the SIGCHLD and sig_atexit() handlers. This patch addresses this problem by clearing child_pid in the SIGCHLD handler.
--- tools/perf/builtin-stat.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-)
tools/perf/builtin-stat.c +22 -1
@@ -87,7 +87,7 @@ static int run_count = 1;static bool no_inherit = false;static bool scale = true;static enum aggr_mode aggr_mode =AGGR_GLOBAL ; -static pid_t child_pid =-1 ; +static volatile pid_t child_pid =-1 ;static bool null_run = false;static int detailed_run =0 ;static bool big_num = true;
@@ -1148,13 +1148,34 @@ static void skip_signal(int signo) done =1 ; signr = signo; +/* +* render child_pid harmless +* won't send SIGTERM to a random +* process in case of race condition +* and fast PID recycling +*/ + child_pid =-1 ; }static void sig_atexit (void ) { +sigset_t set, oset; + +/* +* avoid race condition with SIGCHLD handler +* in skip_signal() which is modifying child_pid +* goal is to avoid send SIGTERM to a random +* process +*/ +sigemptyset (&set); +sigaddset (&set,SIGCHLD ); +sigprocmask (SIG_BLOCK , &set, &oset); +if (child_pid !=-1 )kill (child_pid,SIGTERM ); +sigprocmask (SIG_SETMASK , &oset,NULL ); +if (signr ==-1 )return ;