| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- From a0b37d5a5f250199b6df4e9404d2071802591de6 Mon Sep 17 00:00:00 2001
- From: Thomas Gleixner <[email protected]>
- Date: Mon, 28 Aug 2017 08:47:40 +0200
- Subject: [PATCH 028/242] x86/asm: Replace access to desc_struct:a/b fields
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
- CVE-2017-5754
- The union inside of desc_struct which allows access to the raw u32 parts of
- the descriptors. This raw access part is about to go away.
- Replace the few code parts which access those fields.
- Signed-off-by: Thomas Gleixner <[email protected]>
- Reviewed-by: Boris Ostrovsky <[email protected]>
- Cc: Andy Lutomirski <[email protected]>
- Cc: Borislav Petkov <[email protected]>
- Cc: Brian Gerst <[email protected]>
- Cc: Denys Vlasenko <[email protected]>
- Cc: H. Peter Anvin <[email protected]>
- Cc: Josh Poimboeuf <[email protected]>
- Cc: Juergen Gross <[email protected]>
- Cc: Linus Torvalds <[email protected]>
- Cc: Peter Zijlstra <[email protected]>
- Cc: Steven Rostedt <[email protected]>
- Link: http://lkml.kernel.org/r/[email protected]
- Signed-off-by: Ingo Molnar <[email protected]>
- (cherry picked from commit 9a98e7780022aa7cd201eb8a88a4f1d607b73cde)
- Signed-off-by: Andy Whitcroft <[email protected]>
- Signed-off-by: Kleber Sacilotto de Souza <[email protected]>
- (cherry picked from commit 8469c76c61ea9c3b86b596352d1148bace5ea706)
- Signed-off-by: Fabian Grünbichler <[email protected]>
- ---
- arch/x86/include/asm/xen/hypercall.h | 6 ++++--
- arch/x86/kernel/tls.c | 2 +-
- arch/x86/xen/enlighten_pv.c | 2 +-
- 3 files changed, 6 insertions(+), 4 deletions(-)
- diff --git a/arch/x86/include/asm/xen/hypercall.h b/arch/x86/include/asm/xen/hypercall.h
- index 11071fcd630e..9606688caa4b 100644
- --- a/arch/x86/include/asm/xen/hypercall.h
- +++ b/arch/x86/include/asm/xen/hypercall.h
- @@ -552,6 +552,8 @@ static inline void
- MULTI_update_descriptor(struct multicall_entry *mcl, u64 maddr,
- struct desc_struct desc)
- {
- + u32 *p = (u32 *) &desc;
- +
- mcl->op = __HYPERVISOR_update_descriptor;
- if (sizeof(maddr) == sizeof(long)) {
- mcl->args[0] = maddr;
- @@ -559,8 +561,8 @@ MULTI_update_descriptor(struct multicall_entry *mcl, u64 maddr,
- } else {
- mcl->args[0] = maddr;
- mcl->args[1] = maddr >> 32;
- - mcl->args[2] = desc.a;
- - mcl->args[3] = desc.b;
- + mcl->args[2] = *p++;
- + mcl->args[3] = *p;
- }
-
- trace_xen_mc_entry(mcl, sizeof(maddr) == sizeof(long) ? 2 : 4);
- diff --git a/arch/x86/kernel/tls.c b/arch/x86/kernel/tls.c
- index dcd699baea1b..a106b9719c58 100644
- --- a/arch/x86/kernel/tls.c
- +++ b/arch/x86/kernel/tls.c
- @@ -93,7 +93,7 @@ static void set_tls_desc(struct task_struct *p, int idx,
-
- while (n-- > 0) {
- if (LDT_empty(info) || LDT_zero(info)) {
- - desc->a = desc->b = 0;
- + memset(desc, 0, sizeof(*desc));
- } else {
- fill_ldt(desc, info);
-
- diff --git a/arch/x86/xen/enlighten_pv.c b/arch/x86/xen/enlighten_pv.c
- index 49ee3315b9f7..c76f5ff4d0d7 100644
- --- a/arch/x86/xen/enlighten_pv.c
- +++ b/arch/x86/xen/enlighten_pv.c
- @@ -501,7 +501,7 @@ static void __init xen_load_gdt_boot(const struct desc_ptr *dtr)
- static inline bool desc_equal(const struct desc_struct *d1,
- const struct desc_struct *d2)
- {
- - return d1->a == d2->a && d1->b == d2->b;
- + return !memcmp(d1, d2, sizeof(*d1));
- }
-
- static void load_TLS_descriptor(struct thread_struct *t,
- --
- 2.14.2
|