diff options
author | Eric W. Biederman <ebiederm@xmission.com> | 2019-05-16 06:56:17 +0300 |
---|---|---|
committer | Eric W. Biederman <ebiederm@xmission.com> | 2019-05-29 17:31:43 +0300 |
commit | 8917bef336f5301edd616cfa97b97d0319fd0496 (patch) | |
tree | b7b98fd5884b464519c4c1eca87a3c719d85d306 /kernel/signal.c | |
parent | 2e1661d2673667d886cd40ad9f414cb6db48d8da (diff) | |
download | linux-8917bef336f5301edd616cfa97b97d0319fd0496.tar.xz |
signal: Properly set TRACE_SIGNAL_LOSE_INFO in __send_signal
Any time siginfo is not stored in the signal queue information is
lost. Therefore set TRACE_SIGNAL_LOSE_INFO every time the code does
not allocate a signal queue entry, and a queue overflow abort is not
triggered.
Fixes: ba005e1f4172 ("tracepoint: Add signal loss events")
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Diffstat (limited to 'kernel/signal.c')
-rw-r--r-- | kernel/signal.c | 33 |
1 files changed, 16 insertions, 17 deletions
diff --git a/kernel/signal.c b/kernel/signal.c index d92b636b4e9d..b2f0cf3a68aa 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -1131,23 +1131,22 @@ static int __send_signal(int sig, struct kernel_siginfo *info, struct task_struc copy_siginfo(&q->info, info); break; } - } else if (!is_si_special(info)) { - if (sig >= SIGRTMIN && info->si_code != SI_USER) { - /* - * Queue overflow, abort. We may abort if the - * signal was rt and sent by user using something - * other than kill(). - */ - result = TRACE_SIGNAL_OVERFLOW_FAIL; - ret = -EAGAIN; - goto ret; - } else { - /* - * This is a silent loss of information. We still - * send the signal, but the *info bits are lost. - */ - result = TRACE_SIGNAL_LOSE_INFO; - } + } else if (!is_si_special(info) && + sig >= SIGRTMIN && info->si_code != SI_USER) { + /* + * Queue overflow, abort. We may abort if the + * signal was rt and sent by user using something + * other than kill(). + */ + result = TRACE_SIGNAL_OVERFLOW_FAIL; + ret = -EAGAIN; + goto ret; + } else { + /* + * This is a silent loss of information. We still + * send the signal, but the *info bits are lost. + */ + result = TRACE_SIGNAL_LOSE_INFO; } out_set: |