]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - releases/4.14.14/x86-alternatives-fix-optimize_nops-checking.patch
4.14-stable patches
[thirdparty/kernel/stable-queue.git] / releases / 4.14.14 / x86-alternatives-fix-optimize_nops-checking.patch
CommitLineData
6063b8b5
GKH
1From 612e8e9350fd19cae6900cf36ea0c6892d1a0dca Mon Sep 17 00:00:00 2001
2From: Borislav Petkov <bp@suse.de>
3Date: Wed, 10 Jan 2018 12:28:16 +0100
4Subject: x86/alternatives: Fix optimize_nops() checking
5
6From: Borislav Petkov <bp@suse.de>
7
8commit 612e8e9350fd19cae6900cf36ea0c6892d1a0dca upstream.
9
10The alternatives code checks only the first byte whether it is a NOP, but
11with NOPs in front of the payload and having actual instructions after it
12breaks the "optimized' test.
13
14Make sure to scan all bytes before deciding to optimize the NOPs in there.
15
16Reported-by: David Woodhouse <dwmw2@infradead.org>
17Signed-off-by: Borislav Petkov <bp@suse.de>
18Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
19Cc: Tom Lendacky <thomas.lendacky@amd.com>
20Cc: Andi Kleen <ak@linux.intel.com>
21Cc: Tim Chen <tim.c.chen@linux.intel.com>
22Cc: Peter Zijlstra <peterz@infradead.org>
23Cc: Jiri Kosina <jikos@kernel.org>
24Cc: Dave Hansen <dave.hansen@intel.com>
25Cc: Andi Kleen <andi@firstfloor.org>
26Cc: Andrew Lutomirski <luto@kernel.org>
27Cc: Linus Torvalds <torvalds@linux-foundation.org>
28Cc: Greg Kroah-Hartman <gregkh@linux-foundation.org>
29Cc: Paul Turner <pjt@google.com>
30Link: https://lkml.kernel.org/r/20180110112815.mgciyf5acwacphkq@pd.tnic
31Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
32
33---
34 arch/x86/kernel/alternative.c | 7 +++++--
35 1 file changed, 5 insertions(+), 2 deletions(-)
36
37--- a/arch/x86/kernel/alternative.c
38+++ b/arch/x86/kernel/alternative.c
39@@ -344,9 +344,12 @@ done:
40 static void __init_or_module noinline optimize_nops(struct alt_instr *a, u8 *instr)
41 {
42 unsigned long flags;
43+ int i;
44
45- if (instr[0] != 0x90)
46- return;
47+ for (i = 0; i < a->padlen; i++) {
48+ if (instr[i] != 0x90)
49+ return;
50+ }
51
52 local_irq_save(flags);
53 add_nops(instr + (a->instrlen - a->padlen), a->padlen);