linux-stable/arch/s390
Heiko Carstens 7bf1ce22f9 s390/pfault: fix task state race
commit d5e50a51cc upstream.

When setting the current task state to TASK_UNINTERRUPTIBLE this can
race with a different cpu. The other cpu could set the task state after
it inspected it (while it was still TASK_RUNNING) to TASK_RUNNING which
would change the state from TASK_UNINTERRUPTIBLE to TASK_RUNNING again.

This race was always present in the pfault interrupt code but didn't
cause anything harmful before commit f2db2e6c "[S390] pfault: cpu hotplug
vs missing completion interrupts" which relied on the fact that after
setting the task state to TASK_UNINTERRUPTIBLE the task would really
sleep.
Since this is not necessarily the case the result may be a list corruption
of the pfault_list or, as observed, a use-after-free bug while trying to
access the task_struct of a task which terminated itself already.

To fix this, we need to get a reference of the affected task when receiving
the initial pfault interrupt and add special handling if we receive yet
another initial pfault interrupt when the task is already enqueued in the
pfault list.

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Reviewed-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2012-06-01 15:15:41 +08:00
..
appldata sched/accounting: Change cpustat fields to an array 2011-12-06 09:06:38 +01:00
boot [S390] Remove Kerntypes leftovers 2011-12-27 11:27:12 +01:00
crypto [S390] crypto: avoid MSA3 and MSA4 instructions in ESA mode 2011-11-14 11:19:09 +01:00
hypfs vfs: switch ->show_options() to struct dentry * 2012-01-06 23:19:54 -05:00
include/asm fix tlb flushing for page table pages 2012-04-22 15:39:16 -07:00
kernel Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux 2012-03-01 18:22:55 -08:00
kvm KVM: s390: Sanitize fpc registers for KVM_SET_FPU 2012-05-12 09:32:19 -07:00
lib [S390] sparse: fix sparse warnings with __user pointers 2011-10-30 15:16:46 +01:00
math-emu s390: change to new flag variable 2011-03-17 14:02:57 +01:00
mm s390/pfault: fix task state race 2012-06-01 15:15:41 +08:00
oprofile Merge branch 'perf-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip 2012-01-06 08:02:58 -08:00
defconfig [S390] defconfig: switch on CONFIG_DEVTMPFS 2011-10-30 15:16:42 +01:00
Kbuild [S390] make arch/s390 subdirectories depend on config option 2011-12-27 11:27:12 +01:00
Kconfig fix tlb flushing for page table pages 2012-04-22 15:39:16 -07:00
Kconfig.debug [S390] Write protect module text and RO data 2011-03-15 17:08:23 +01:00
Makefile [S390] cleanup entry point definition 2012-01-18 18:03:41 +01:00