]> www.infradead.org Git - linux.git/commitdiff
signal: Replace BUG_ON()s
authorThomas Gleixner <tglx@linutronix.de>
Mon, 10 Jun 2024 16:42:34 +0000 (18:42 +0200)
committerFrederic Weisbecker <frederic@kernel.org>
Mon, 29 Jul 2024 19:57:35 +0000 (21:57 +0200)
These really can be handled gracefully without killing the machine.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Frederic Weisbecker <frederic@kernel.org>
Reviewed-by: Oleg Nesterov <oleg@redhat.com>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
kernel/signal.c

index 897765b254f93a583c36639805289ec7db5b6304..6f3a5aa39b091d5e5372ea13a8967aef01af0b7c 100644 (file)
@@ -1938,10 +1938,11 @@ struct sigqueue *sigqueue_alloc(void)
 
 void sigqueue_free(struct sigqueue *q)
 {
-       unsigned long flags;
        spinlock_t *lock = &current->sighand->siglock;
+       unsigned long flags;
 
-       BUG_ON(!(q->flags & SIGQUEUE_PREALLOC));
+       if (WARN_ON_ONCE(!(q->flags & SIGQUEUE_PREALLOC)))
+               return;
        /*
         * We must hold ->siglock while testing q->list
         * to serialize with collect_signal() or with
@@ -1969,7 +1970,10 @@ int send_sigqueue(struct sigqueue *q, struct pid *pid, enum pid_type type)
        unsigned long flags;
        int ret, result;
 
-       BUG_ON(!(q->flags & SIGQUEUE_PREALLOC));
+       if (WARN_ON_ONCE(!(q->flags & SIGQUEUE_PREALLOC)))
+               return 0;
+       if (WARN_ON_ONCE(q->info.si_code != SI_TIMER))
+               return 0;
 
        ret = -1;
        rcu_read_lock();
@@ -2004,7 +2008,6 @@ int send_sigqueue(struct sigqueue *q, struct pid *pid, enum pid_type type)
                 * If an SI_TIMER entry is already queue just increment
                 * the overrun count.
                 */
-               BUG_ON(q->info.si_code != SI_TIMER);
                q->info.si_overrun++;
                result = TRACE_SIGNAL_ALREADY_PENDING;
                goto out;