diff options
Diffstat (limited to 'kernel/signal.c')
-rw-r--r-- | kernel/signal.c | 15 |
1 files changed, 6 insertions, 9 deletions
diff --git a/kernel/signal.c b/kernel/signal.c index c5b9aabb1550..50ad439377b2 100644 --- a/kernel/signal.c +++ b/kernel/signal.c | |||
@@ -341,7 +341,6 @@ unblock_all_signals(void) | |||
341 | static int collect_signal(int sig, struct sigpending *list, siginfo_t *info) | 341 | static int collect_signal(int sig, struct sigpending *list, siginfo_t *info) |
342 | { | 342 | { |
343 | struct sigqueue *q, *first = NULL; | 343 | struct sigqueue *q, *first = NULL; |
344 | int still_pending = 0; | ||
345 | 344 | ||
346 | /* | 345 | /* |
347 | * Collect the siginfo appropriate to this signal. Check if | 346 | * Collect the siginfo appropriate to this signal. Check if |
@@ -349,26 +348,24 @@ static int collect_signal(int sig, struct sigpending *list, siginfo_t *info) | |||
349 | */ | 348 | */ |
350 | list_for_each_entry(q, &list->list, list) { | 349 | list_for_each_entry(q, &list->list, list) { |
351 | if (q->info.si_signo == sig) { | 350 | if (q->info.si_signo == sig) { |
352 | if (first) { | 351 | if (first) |
353 | still_pending = 1; | 352 | goto still_pending; |
354 | break; | ||
355 | } | ||
356 | first = q; | 353 | first = q; |
357 | } | 354 | } |
358 | } | 355 | } |
356 | |||
357 | sigdelset(&list->signal, sig); | ||
358 | |||
359 | if (first) { | 359 | if (first) { |
360 | still_pending: | ||
360 | list_del_init(&first->list); | 361 | list_del_init(&first->list); |
361 | copy_siginfo(info, &first->info); | 362 | copy_siginfo(info, &first->info); |
362 | __sigqueue_free(first); | 363 | __sigqueue_free(first); |
363 | if (!still_pending) | ||
364 | sigdelset(&list->signal, sig); | ||
365 | } else { | 364 | } else { |
366 | |||
367 | /* Ok, it wasn't in the queue. This must be | 365 | /* Ok, it wasn't in the queue. This must be |
368 | a fast-pathed signal or we must have been | 366 | a fast-pathed signal or we must have been |
369 | out of queue space. So zero out the info. | 367 | out of queue space. So zero out the info. |
370 | */ | 368 | */ |
371 | sigdelset(&list->signal, sig); | ||
372 | info->si_signo = sig; | 369 | info->si_signo = sig; |
373 | info->si_errno = 0; | 370 | info->si_errno = 0; |
374 | info->si_code = 0; | 371 | info->si_code = 0; |