Instead of using a goto for this let's add a simple helper copy_pending()
which can be called in both places.

Signed-off-by: Christian Brauner <christ...@brauner.io>
---
v0->v1:
* patch unchanged
---
 kernel/signal.c | 54 +++++++++++++++++++++++++++----------------------
 1 file changed, 30 insertions(+), 24 deletions(-)

diff --git a/kernel/signal.c b/kernel/signal.c
index bc750fb4ddcc..baae137455eb 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -515,6 +515,19 @@ int unhandled_signal(struct task_struct *tsk, int sig)
        return !tsk->ptrace;
 }
 
+static void copy_pending(siginfo_t *info, struct sigqueue *first,
+                        bool *resched_timer)
+{
+       list_del_init(&first->list);
+       copy_siginfo(info, &first->info);
+
+       *resched_timer = (first->flags & SIGQUEUE_PREALLOC) &&
+                        (info->si_code == SI_TIMER) &&
+                        (info->si_sys_private);
+
+       __sigqueue_free(first);
+}
+
 static void collect_signal(int sig, struct sigpending *list, siginfo_t *info,
                           bool *resched_timer)
 {
@@ -526,8 +539,10 @@ static void collect_signal(int sig, struct sigpending 
*list, siginfo_t *info,
        */
        list_for_each_entry(q, &list->list, list) {
                if (q->info.si_signo == sig) {
-                       if (first)
-                               goto still_pending;
+                       if (first) {
+                               copy_pending(info, first, resched_timer);
+                               return;
+                       }
                        first = q;
                }
        }
@@ -535,29 +550,20 @@ static void collect_signal(int sig, struct sigpending 
*list, siginfo_t *info,
        sigdelset(&list->signal, sig);
 
        if (first) {
-still_pending:
-               list_del_init(&first->list);
-               copy_siginfo(info, &first->info);
-
-               *resched_timer =
-                       (first->flags & SIGQUEUE_PREALLOC) &&
-                       (info->si_code == SI_TIMER) &&
-                       (info->si_sys_private);
-
-               __sigqueue_free(first);
-       } else {
-               /*
-                * Ok, it wasn't in the queue.  This must be
-                * a fast-pathed signal or we must have been
-                * out of queue space.  So zero out the info.
-                */
-               clear_siginfo(info);
-               info->si_signo = sig;
-               info->si_errno = 0;
-               info->si_code = SI_USER;
-               info->si_pid = 0;
-               info->si_uid = 0;
+               copy_pending(info, first, resched_timer);
+               return;
        }
+
+       /*
+        * Ok, it wasn't in the queue. This must be a fast-pathed signal or we
+        * must have been out of queue space. So zero out the info.
+        */
+       clear_siginfo(info);
+       info->si_signo = sig;
+       info->si_errno = 0;
+       info->si_code = SI_USER;
+       info->si_pid = 0;
+       info->si_uid = 0;
 }
 
 static int __dequeue_signal(struct sigpending *pending, sigset_t *mask,
-- 
2.17.0

Reply via email to