]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.4-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 15 Oct 2017 14:34:10 +0000 (16:34 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 15 Oct 2017 14:34:10 +0000 (16:34 +0200)
added patches:
x86-alternatives-fix-alt_max_short-macro-to-really-be-a-max.patch

queue-4.4/series
queue-4.4/x86-alternatives-fix-alt_max_short-macro-to-really-be-a-max.patch [new file with mode: 0644]

index 2bf0985bf9ecb5ec7542f803ad4696f959c64b60..6e13699545a0a1d3797cf1ed8d494d398b8fbf19 100644 (file)
@@ -25,3 +25,4 @@ usb-serial-cp210x-add-support-for-elv-tfd500.patch
 usb-serial-option-add-support-for-tp-link-lte-module.patch
 usb-serial-qcserial-add-dell-dw5818-dw5819.patch
 usb-serial-console-fix-use-after-free-after-failed-setup.patch
+x86-alternatives-fix-alt_max_short-macro-to-really-be-a-max.patch
diff --git a/queue-4.4/x86-alternatives-fix-alt_max_short-macro-to-really-be-a-max.patch b/queue-4.4/x86-alternatives-fix-alt_max_short-macro-to-really-be-a-max.patch
new file mode 100644 (file)
index 0000000..cfee83a
--- /dev/null
@@ -0,0 +1,79 @@
+From 6b32c126d33d5cb379bca280ab8acedc1ca978ff Mon Sep 17 00:00:00 2001
+From: Mathias Krause <minipli@googlemail.com>
+Date: Thu, 5 Oct 2017 20:30:12 +0200
+Subject: x86/alternatives: Fix alt_max_short macro to really be a max()
+
+From: Mathias Krause <minipli@googlemail.com>
+
+commit 6b32c126d33d5cb379bca280ab8acedc1ca978ff upstream.
+
+The alt_max_short() macro in asm/alternative.h does not work as
+intended, leading to nasty bugs. E.g. alt_max_short("1", "3")
+evaluates to 3, but alt_max_short("3", "1") evaluates to 1 -- not
+exactly the maximum of 1 and 3.
+
+In fact, I had to learn it the hard way by crashing my kernel in not
+so funny ways by attempting to make use of the ALTENATIVE_2 macro
+with alternatives where the first one was larger than the second
+one.
+
+According to [1] and commit dbe4058a6a44 ("x86/alternatives: Fix
+ALTERNATIVE_2 padding generation properly") the right handed side
+should read "-(-(a < b))" not "-(-(a - b))". Fix that, to make the
+macro work as intended.
+
+While at it, fix up the comments regarding the additional "-", too.
+It's not about gas' usage of s32 but brain dead logic of having a
+"true" value of -1 for the < operator ... *sigh*
+
+Btw., the one in asm/alternative-asm.h is correct. And, apparently,
+all current users of ALTERNATIVE_2() pass same sized alternatives,
+avoiding to hit the bug.
+
+[1] http://graphics.stanford.edu/~seander/bithacks.html#IntegerMinOrMax
+
+Reviewed-and-tested-by: Borislav Petkov <bp@suse.de>
+Fixes: dbe4058a6a44 ("x86/alternatives: Fix ALTERNATIVE_2 padding generation properly")
+Signed-off-by: Mathias Krause <minipli@googlemail.com>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Cc: Borislav Petkov <bp@suse.de>
+Link: https://lkml.kernel.org/r/1507228213-13095-1-git-send-email-minipli@googlemail.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ arch/x86/include/asm/alternative-asm.h |    4 +++-
+ arch/x86/include/asm/alternative.h     |    6 +++---
+ 2 files changed, 6 insertions(+), 4 deletions(-)
+
+--- a/arch/x86/include/asm/alternative-asm.h
++++ b/arch/x86/include/asm/alternative-asm.h
+@@ -62,8 +62,10 @@
+ #define new_len2              145f-144f
+ /*
+- * max without conditionals. Idea adapted from:
++ * gas compatible max based on the idea from:
+  * http://graphics.stanford.edu/~seander/bithacks.html#IntegerMinOrMax
++ *
++ * The additional "-" is needed because gas uses a "true" value of -1.
+  */
+ #define alt_max_short(a, b)   ((a) ^ (((a) ^ (b)) & -(-((a) < (b)))))
+--- a/arch/x86/include/asm/alternative.h
++++ b/arch/x86/include/asm/alternative.h
+@@ -102,12 +102,12 @@ static inline int alternatives_text_rese
+       alt_end_marker ":\n"
+ /*
+- * max without conditionals. Idea adapted from:
++ * gas compatible max based on the idea from:
+  * http://graphics.stanford.edu/~seander/bithacks.html#IntegerMinOrMax
+  *
+- * The additional "-" is needed because gas works with s32s.
++ * The additional "-" is needed because gas uses a "true" value of -1.
+  */
+-#define alt_max_short(a, b)   "((" a ") ^ (((" a ") ^ (" b ")) & -(-((" a ") - (" b ")))))"
++#define alt_max_short(a, b)   "((" a ") ^ (((" a ") ^ (" b ")) & -(-((" a ") < (" b ")))))"
+ /*
+  * Pad the second replacement alternative with additional NOPs if it is