-
James Morris authored
This patch by Kaigai Kohei fixes a bug in the SELinux sidtab code, where we do a spin_unlock_irq() while nested under another irq lock, which enables interrupts and allows a deadlock to happen: sidtab_set() is called between POLICY_WRLOCK and POLICY_WRUNLOCK in services.c:1092. sidtab_set() uses SIDTAB_LOCK()/SIDTAB_UNLOCK(), but SIDTAB_UNLOCK() enables any interruptions because it's defined as spin_unlock_irq(). If an interruption occurs between SIDTAB_UNLOCK() and POLICY_WRUNLOCK, and interruption context try to hold the POLICY_RDLOCK, then a deadlock happen in the result. The solution is to save & restore flags on the inner lock, per the patch below. Signed-off-by: James Morris <jmorris@redhat.com> Signed-off-by: Stephen Smalley <sds@epoch.ncsc.mil> Signed-off-by: Kaigai Kohei <kaigai@ak.jp.nec.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
e46c823e