In preparation for FORTIFY_SOURCE performing compile-time and run-time
field bounds checking for memset(), avoid intentionally writing across
neighboring fields.

Add struct_group() to mark region of struct x86_emulate_ctxt that should
be initialized to zero.

Cc: Paolo Bonzini <pbonz...@redhat.com>
Cc: Sean Christopherson <sea...@google.com>
Cc: Vitaly Kuznetsov <vkuzn...@redhat.com>
Cc: Wanpeng Li <wanpen...@tencent.com>
Cc: Jim Mattson <jmatt...@google.com>
Cc: Joerg Roedel <j...@8bytes.org>
Cc: Thomas Gleixner <t...@linutronix.de>
Cc: Ingo Molnar <mi...@redhat.com>
Cc: Borislav Petkov <b...@alien8.de>
Cc: x...@kernel.org
Cc: "H. Peter Anvin" <h...@zytor.com>
Cc: k...@vger.kernel.org
Signed-off-by: Kees Cook <keesc...@chromium.org>
---
 arch/x86/kvm/emulate.c     |  3 +--
 arch/x86/kvm/kvm_emulate.h | 19 +++++++++++--------
 2 files changed, 12 insertions(+), 10 deletions(-)

diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index 2837110e66ed..2608a047e769 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -5377,8 +5377,7 @@ static int fastop(struct x86_emulate_ctxt *ctxt, fastop_t 
fop)
 
 void init_decode_cache(struct x86_emulate_ctxt *ctxt)
 {
-       memset(&ctxt->rip_relative, 0,
-              (void *)&ctxt->modrm - (void *)&ctxt->rip_relative);
+       memset(&ctxt->decode_cache, 0, sizeof(ctxt->decode_cache));
 
        ctxt->io_read.pos = 0;
        ctxt->io_read.end = 0;
diff --git a/arch/x86/kvm/kvm_emulate.h b/arch/x86/kvm/kvm_emulate.h
index 68b420289d7e..9b8afcb8ad39 100644
--- a/arch/x86/kvm/kvm_emulate.h
+++ b/arch/x86/kvm/kvm_emulate.h
@@ -341,14 +341,17 @@ struct x86_emulate_ctxt {
         * the rest are initialized unconditionally in x86_decode_insn
         * or elsewhere
         */
-       bool rip_relative;
-       u8 rex_prefix;
-       u8 lock_prefix;
-       u8 rep_prefix;
-       /* bitmaps of registers in _regs[] that can be read */
-       u32 regs_valid;
-       /* bitmaps of registers in _regs[] that have been written */
-       u32 regs_dirty;
+       struct_group(decode_cache,
+               bool rip_relative;
+               u8 rex_prefix;
+               u8 lock_prefix;
+               u8 rep_prefix;
+               /* bitmaps of registers in _regs[] that can be read */
+               u32 regs_valid;
+               /* bitmaps of registers in _regs[] that have been written */
+               u32 regs_dirty;
+       );
+
        /* modrm */
        u8 modrm;
        u8 modrm_mod;
-- 
2.30.2

Reply via email to