|
@@ -126,6 +126,12 @@ static void __exit_signal(struct task_struct *tsk)
|
|
|
|
|
|
__unhash_process(tsk);
|
|
__unhash_process(tsk);
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Do this under ->siglock, we can race with another thread
|
|
|
|
+ * doing sigqueue_free() if we have SIGQUEUE_PREALLOC signals.
|
|
|
|
+ */
|
|
|
|
+ flush_sigqueue(&tsk->pending);
|
|
|
|
+
|
|
tsk->signal = NULL;
|
|
tsk->signal = NULL;
|
|
tsk->sighand = NULL;
|
|
tsk->sighand = NULL;
|
|
spin_unlock(&sighand->siglock);
|
|
spin_unlock(&sighand->siglock);
|
|
@@ -133,7 +139,6 @@ static void __exit_signal(struct task_struct *tsk)
|
|
|
|
|
|
__cleanup_sighand(sighand);
|
|
__cleanup_sighand(sighand);
|
|
clear_tsk_thread_flag(tsk,TIF_SIGPENDING);
|
|
clear_tsk_thread_flag(tsk,TIF_SIGPENDING);
|
|
- flush_sigqueue(&tsk->pending);
|
|
|
|
if (sig) {
|
|
if (sig) {
|
|
flush_sigqueue(&sig->shared_pending);
|
|
flush_sigqueue(&sig->shared_pending);
|
|
taskstats_tgid_free(sig);
|
|
taskstats_tgid_free(sig);
|