From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
stable@vger.kernel.org, Dave Martin <Dave.Martin@arm.com>,
Ard Biesheuvel <ard.biesheuvel@linaro.org>,
Will Deacon <will.deacon@arm.com>
Subject: [PATCH 3.18 25/64] arm64: fpsimd: Prevent registers leaking from dead tasks
Date: Fri, 15 Dec 2017 10:21:49 +0100 [thread overview]
Message-ID: <20171215092212.996820062@linuxfoundation.org> (raw)
In-Reply-To: <20171215092212.018372669@linuxfoundation.org>
3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dave Martin <Dave.Martin@arm.com>
commit 071b6d4a5d343046f253a5a8835d477d93992002 upstream.
Currently, loading of a task's fpsimd state into the CPU registers
is skipped if that task's state is already present in the registers
of that CPU.
However, the code relies on the struct fpsimd_state * (and by
extension struct task_struct *) to unambiguously identify a task.
There is a particular case in which this doesn't work reliably:
when a task exits, its task_struct may be recycled to describe a
new task.
Consider the following scenario:
1) Task P loads its fpsimd state onto cpu C.
per_cpu(fpsimd_last_state, C) := P;
P->thread.fpsimd_state.cpu := C;
2) Task X is scheduled onto C and loads its fpsimd state on C.
per_cpu(fpsimd_last_state, C) := X;
X->thread.fpsimd_state.cpu := C;
3) X exits, causing X's task_struct to be freed.
4) P forks a new child T, which obtains X's recycled task_struct.
T == X.
T->thread.fpsimd_state.cpu == C (inherited from P).
5) T is scheduled on C.
T's fpsimd state is not loaded, because
per_cpu(fpsimd_last_state, C) == T (== X) &&
T->thread.fpsimd_state.cpu == C.
(This is the check performed by fpsimd_thread_switch().)
So, T gets X's registers because the last registers loaded onto C
were those of X, in (2).
This patch fixes the problem by ensuring that the sched-in check
fails in (5): fpsimd_flush_task_state(T) is called when T is
forked, so that T->thread.fpsimd_state.cpu == C cannot be true.
This relies on the fact that T is not schedulable until after
copy_thread() completes.
Once T's fpsimd state has been loaded on some CPU C there may still
be other cpus D for which per_cpu(fpsimd_last_state, D) ==
&X->thread.fpsimd_state. But D is necessarily != C in this case,
and the check in (5) must fail.
An alternative fix would be to do refcounting on task_struct. This
would result in each CPU holding a reference to the last task whose
fpsimd state was loaded there. It's not clear whether this is
preferable, and it involves higher overhead than the fix proposed
in this patch. It would also move all the task_struct freeing
work into the context switch critical section, or otherwise some
deferred cleanup mechanism would need to be introduced, neither of
which seems obviously justified.
Fixes: 005f78cd8849 ("arm64: defer reloading a task's FPSIMD state to userland resume")
Signed-off-by: Dave Martin <Dave.Martin@arm.com>
Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
[will: word-smithed the comment so it makes more sense]
Signed-off-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
arch/arm64/kernel/process.c | 9 +++++++++
1 file changed, 9 insertions(+)
--- a/arch/arm64/kernel/process.c
+++ b/arch/arm64/kernel/process.c
@@ -250,6 +250,15 @@ int copy_thread(unsigned long clone_flag
memset(&p->thread.cpu_context, 0, sizeof(struct cpu_context));
+ /*
+ * In case p was allocated the same task_struct pointer as some
+ * other recently-exited task, make sure p is disassociated from
+ * any cpu that may have run that now-exited task recently.
+ * Otherwise we could erroneously skip reloading the FPSIMD
+ * registers for p.
+ */
+ fpsimd_flush_task_state(p);
+
if (likely(!(p->flags & PF_KTHREAD))) {
*childregs = *current_pt_regs();
childregs->regs[0] = 0;
next prev parent reply other threads:[~2017-12-15 9:28 UTC|newest]
Thread overview: 64+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-12-15 9:21 [PATCH 3.18 00/64] 3.18.88-stable review Greg Kroah-Hartman
2017-12-15 9:21 ` [PATCH 3.18 01/64] can: kvaser_usb: free buf in error paths Greg Kroah-Hartman
2017-12-15 9:21 ` [PATCH 3.18 02/64] can: kvaser_usb: Fix comparison bug in kvaser_usb_read_bulk_callback() Greg Kroah-Hartman
2017-12-15 9:21 ` [PATCH 3.18 03/64] can: kvaser_usb: ratelimit errors if incomplete messages are received Greg Kroah-Hartman
2017-12-15 9:21 ` [PATCH 3.18 04/64] can: kvaser_usb: cancel urb on -EPIPE and -EPROTO Greg Kroah-Hartman
2017-12-15 9:21 ` [PATCH 3.18 05/64] can: ems_usb: " Greg Kroah-Hartman
2017-12-15 9:21 ` [PATCH 3.18 06/64] can: esd_usb2: " Greg Kroah-Hartman
2017-12-15 9:21 ` [PATCH 3.18 07/64] can: usb_8dev: " Greg Kroah-Hartman
2017-12-15 9:21 ` [PATCH 3.18 08/64] virtio: release virtio index when fail to device_register Greg Kroah-Hartman
2017-12-15 9:21 ` [PATCH 3.18 09/64] hv: kvp: Avoid reading past allocated blocks from KVP file Greg Kroah-Hartman
2017-12-15 9:21 ` [PATCH 3.18 10/64] isa: Prevent NULL dereference in isa_bus driver callbacks Greg Kroah-Hartman
2017-12-15 9:21 ` [PATCH 3.18 11/64] efi: Move some sysfs files to be read-only by root Greg Kroah-Hartman
2017-12-15 9:21 ` [PATCH 3.18 12/64] ASN.1: check for error from ASN1_OP_END__ACT actions Greg Kroah-Hartman
2017-12-15 9:21 ` [PATCH 3.18 13/64] KEYS: add missing permission check for request_key() destination Greg Kroah-Hartman
2017-12-15 9:21 ` [PATCH 3.18 14/64] X.509: reject invalid BIT STRING for subjectPublicKey Greg Kroah-Hartman
2017-12-15 9:21 ` [PATCH 3.18 15/64] x86/PCI: Make broadcom_postcore_init() check acpi_disabled Greg Kroah-Hartman
2017-12-15 9:21 ` [PATCH 3.18 16/64] ALSA: pcm: prevent UAF in snd_pcm_info Greg Kroah-Hartman
2017-12-15 9:21 ` [PATCH 3.18 17/64] ALSA: seq: Remove spurious WARN_ON() at timer check Greg Kroah-Hartman
2017-12-15 9:21 ` [PATCH 3.18 18/64] ALSA: usb-audio: Fix out-of-bound error Greg Kroah-Hartman
2017-12-15 9:21 ` [PATCH 3.18 19/64] ALSA: usb-audio: Add check return value for usb_string() Greg Kroah-Hartman
2017-12-15 9:21 ` [PATCH 3.18 20/64] iommu/vt-d: Fix scatterlist offset handling Greg Kroah-Hartman
2017-12-15 9:21 ` [PATCH 3.18 21/64] kdb: Fix handling of kallsyms_symbol_next() return value Greg Kroah-Hartman
2017-12-15 9:21 ` [PATCH 3.18 22/64] media: dvb: i2c transfers over usb cannot be done from stack Greg Kroah-Hartman
2017-12-15 9:21 ` [PATCH 3.18 23/64] arm64: KVM: fix VTTBR_BADDR_MASK BUG_ON off-by-one Greg Kroah-Hartman
2017-12-15 9:21 ` Greg Kroah-Hartman [this message]
2017-12-15 9:21 ` [PATCH 3.18 27/64] sit: update frag_off info Greg Kroah-Hartman
2017-12-15 9:21 ` [PATCH 3.18 28/64] net/packet: fix a race in packet_bind() and packet_notifier() Greg Kroah-Hartman
2017-12-15 9:21 ` [PATCH 3.18 29/64] Revert "drm/armada: Fix compile fail" Greg Kroah-Hartman
2017-12-15 9:21 ` [PATCH 3.18 30/64] Revert "s390/kbuild: enable modversions for symbols exported from asm" Greg Kroah-Hartman
2017-12-15 9:21 ` [PATCH 3.18 31/64] selftest/powerpc: Fix false failures for skipped tests Greg Kroah-Hartman
2017-12-15 9:21 ` [PATCH 3.18 32/64] usb: gadget: configs: plug memory leak Greg Kroah-Hartman
2017-12-15 9:21 ` [PATCH 3.18 33/64] USB: gadgetfs: Fix a potential memory leak in dev_config() Greg Kroah-Hartman
2017-12-15 9:21 ` [PATCH 3.18 34/64] libata: drop WARN from protocol error in ata_sff_qc_issue() Greg Kroah-Hartman
2017-12-15 9:21 ` [PATCH 3.18 35/64] workqueue: trigger WARN if queue_delayed_work() is called with NULL @wq Greg Kroah-Hartman
2017-12-15 9:22 ` [PATCH 3.18 36/64] scsi: lpfc: Fix crash during Hardware error recovery on SLI3 adapters Greg Kroah-Hartman
2017-12-15 9:22 ` [PATCH 3.18 37/64] irqchip/crossbar: Fix incorrect type of register size Greg Kroah-Hartman
2017-12-15 9:22 ` [PATCH 3.18 39/64] arm: KVM: Survive unknown traps from guests Greg Kroah-Hartman
2017-12-15 9:22 ` [PATCH 3.18 40/64] spi_ks8995: fix "BUG: key accdaa28 not in .data!" Greg Kroah-Hartman
2017-12-15 9:22 ` [PATCH 3.18 41/64] bnx2x: fix possible overrun of VFPF multicast addresses array Greg Kroah-Hartman
2017-12-15 9:22 ` [PATCH 3.18 42/64] ipv6: reorder icmpv6_init() and ip6_mr_init() Greg Kroah-Hartman
2017-12-15 9:22 ` [PATCH 3.18 43/64] crypto: s5p-sss - Fix completing crypto request in IRQ handler Greg Kroah-Hartman
2017-12-15 9:22 ` [PATCH 3.18 44/64] i2c: riic: fix restart condition Greg Kroah-Hartman
2017-12-15 9:22 ` [PATCH 3.18 45/64] axonram: Fix gendisk handling Greg Kroah-Hartman
2017-12-15 9:22 ` [PATCH 3.18 48/64] route: also update fnhe_genid when updating a route cache Greg Kroah-Hartman
2017-12-15 9:22 ` [PATCH 3.18 49/64] route: update fnhe_expires for redirect when the fnhe exists Greg Kroah-Hartman
2017-12-15 9:22 ` [PATCH 3.18 50/64] lib/genalloc.c: make the avail variable an atomic_long_t Greg Kroah-Hartman
2017-12-15 9:22 ` [PATCH 3.18 51/64] dynamic-debug-howto: fix optional/omitted ending line number to be LARGE instead of 0 Greg Kroah-Hartman
2017-12-15 9:22 ` [PATCH 3.18 52/64] NFS: Fix a typo in nfs_rename() Greg Kroah-Hartman
2017-12-15 9:22 ` [PATCH 3.18 53/64] sunrpc: Fix rpc_task_begin trace point Greg Kroah-Hartman
2017-12-15 9:22 ` [PATCH 3.18 54/64] sparc64/mm: set fields in deferred pages Greg Kroah-Hartman
2017-12-15 9:22 ` [PATCH 3.18 55/64] sctp: do not free asoc when it is already dead in sctp_sendmsg Greg Kroah-Hartman
2017-12-15 9:22 ` [PATCH 3.18 56/64] sctp: use the right sk after waking up from wait_buf sleep Greg Kroah-Hartman
2017-12-15 9:22 ` [PATCH 3.18 57/64] atm: horizon: Fix irq release error Greg Kroah-Hartman
2017-12-15 9:22 ` [PATCH 3.18 58/64] xfrm: Copy policy family in clone_policy Greg Kroah-Hartman
2017-12-15 9:22 ` [PATCH 3.18 59/64] IB/mlx4: Increase maximal message size under UD QP Greg Kroah-Hartman
2017-12-15 9:22 ` [PATCH 3.18 60/64] IB/mlx5: Assign send CQ and recv CQ of UMR QP Greg Kroah-Hartman
2017-12-15 9:22 ` [PATCH 3.18 61/64] afs: Connect up the CB.ProbeUuid Greg Kroah-Hartman
2017-12-15 9:22 ` [PATCH 3.18 62/64] audit: ensure that audit=1 actually enables audit for PID 1 Greg Kroah-Hartman
2017-12-15 9:22 ` [PATCH 3.18 63/64] arm: KVM: Fix VTTBR_BADDR_MASK BUG_ON off-by-one Greg Kroah-Hartman
2017-12-15 9:22 ` [PATCH 3.18 64/64] usb: gadget: ffs: Forbid usb_ep_alloc_request from sleeping Greg Kroah-Hartman
2017-12-15 11:22 ` [PATCH 3.18 00/64] 3.18.88-stable review Sebastian Gottschall
2017-12-15 12:55 ` Greg Kroah-Hartman
2017-12-15 17:39 ` Guenter Roeck
2017-12-15 21:18 ` Shuah Khan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20171215092212.996820062@linuxfoundation.org \
--to=gregkh@linuxfoundation.org \
--cc=Dave.Martin@arm.com \
--cc=ard.biesheuvel@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=stable@vger.kernel.org \
--cc=will.deacon@arm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.