User: | Jiri Slaby |
Error type: | Double Unlock |
Error type description: | Some lock is unlocked twice unintentionally in a sequence |
File location: | kernel/signal.c |
Line in file: | 1833 |
Project: | Linux Kernel |
Project version: | 2.6.28 |
Tools: |
Stanse
(1.2)
|
Entered: | 2012-04-30 10:52:00 UTC |
1803 ka->sa.sa_handler = SIG_DFL; 1804 1805 break; /* will return non-zero "signr" value */ 1806 } 1807 1808 /* 1809 * Now we are doing the default action for this signal. 1810 */ 1811 if (sig_kernel_ignore(signr)) /* Default is nothing. */ 1812 continue; 1813 1814 /* 1815 * Global init gets no signals it doesn't want. 1816 */ 1817 if (unlikely(signal->flags & SIGNAL_UNKILLABLE) && 1818 !signal_group_exit(signal)) 1819 continue; 1820 1821 if (sig_kernel_stop(signr)) { 1822 /* 1823 * The default action is to stop all threads in 1824 * the thread group. The job control signals 1825 * do nothing in an orphaned pgrp, but SIGSTOP 1826 * always works. Note that siglock needs to be 1827 * dropped during the call to is_orphaned_pgrp() 1828 * because of lock ordering with tasklist_lock. 1829 * This allows an intervening SIGCONT to be posted. 1830 * We need to check for that and bail out if necessary. 1831 */ 1832 if (signr != SIGSTOP) { 1833 spin_unlock_irq(&sighand->siglock); 1834 1835 /* signals can be posted during this window */ 1836 1837 if (is_current_pgrp_orphaned()) 1838 goto relock; 1839 1840 spin_lock_irq(&sighand->siglock); 1841 } 1842 1843 if (likely(do_signal_stop(info->si_signo))) {