Showing error 1172

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: 1855
Project: Linux Kernel
Project version: 2.6.28
Tools: Stanse (1.2)
Entered: 2012-04-30 10:52:00 UTC


Source:

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))) {
1844                                /* It released the siglock.  */
1845                                goto relock;
1846                        }
1847
1848                        /*
1849                         * We didn't actually stop, due to a race
1850                         * with SIGCONT or something like that.
1851                         */
1852                        continue;
1853                }
1854
1855                spin_unlock_irq(&sighand->siglock);
1856
1857                /*
1858                 * Anything else is fatal, maybe with a core dump.
1859                 */
1860                current->flags |= PF_SIGNALED;
1861
1862                if (sig_kernel_coredump(signr)) {
1863                        if (print_fatal_signals)
1864                                print_fatal_signal(regs, info->si_signo);
1865                        /*
Show full sources