• Ian Munsie's avatar
    perf record: prevent kill(0, SIGTERM); · 5ffc8881
    Ian Munsie authored
    At exit, perf record will kill the process it was profiling by sending a
    SIGTERM to child_pid (if it had been initialised), but in certain situations
    child_pid may be 0 and perf would mistakenly kill more processes than intended.
    
    child_pid is set to the return of fork() to either 0 or the pid of the child.
    Ordinarily this would not present an issue as the child calls execvp to spawn
    the process to be profiled and would therefore never run it's sig_atexit and
    never attempt to kill pid 0.
    
    However, if a nonexistant binary had been passed in to perf record the call to
    execvp would fail and child_pid would be left set to 0. The child would then
    exit and it's atexit handler, finding that child_pid was initialised to 0,
    would call kill(0, SIGTERM), resulting in every process within it's process
    group being killed.
    
    In the case that perf was being run directly from the shell this typically
    would not be an issue as the shell isolates the process.  However, if perf was
    being called from another program it could kill unexpected processes, which may
    even include X.
    
    This patch changes the logic of the test for whether child_pid was initialised
    to only consider positive pids as valid, thereby never attempting to kill pid
    0.
    
    Cc: David S. Miller <davem@davemloft.net>
    Cc: Frédéric Weisbecker <fweisbec@gmail.com>
    Cc: Ingo Molnar <mingo@elte.hu>
    Cc: Paul Mackerras <paulus@samba.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Tom Zanussi <tzanussi@gmail.com>
    LKML-Reference: <1276072680-17378-1-git-send-email-imunsie@au1.ibm.com>
    Signed-off-by: default avatarIan Munsie <imunsie@au1.ibm.com>
    Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    5ffc8881
builtin-record.c 21.3 KB