[Lldb-commits] [lldb] r271876 - (Minor tweak) Make RegisterContextWindows_x86/x64::GetRegisterInfoAtIndex

Carlo Kok via lldb-commits lldb-commits at lists.llvm.org
Mon Jun 6 02:40:27 PDT 2016


Author: carlokok
Date: Mon Jun  6 04:40:27 2016
New Revision: 271876

URL: http://llvm.org/viewvc/llvm-project?rev=271876&view=rev
Log:
(Minor tweak) Make RegisterContextWindows_x86/x64::GetRegisterInfoAtIndex 
return NULL for an invalid register.

The unwind logic asks for the "return address register" which doesn't exist
on x86/x86_64, returns -1 and calls this with -1 as a parameter, ends up 
out of scope of the array bounds for g_register_infos and later SIGSEGVs 
on accessing. This now matches the other GetRegisterInfoAtIndex for
other platforms.


Modified:
    lldb/trunk/source/Plugins/Process/Windows/Common/x64/RegisterContextWindows_x64.cpp
    lldb/trunk/source/Plugins/Process/Windows/Common/x86/RegisterContextWindows_x86.cpp

Modified: lldb/trunk/source/Plugins/Process/Windows/Common/x64/RegisterContextWindows_x64.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Windows/Common/x64/RegisterContextWindows_x64.cpp?rev=271876&r1=271875&r2=271876&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/Windows/Common/x64/RegisterContextWindows_x64.cpp (original)
+++ lldb/trunk/source/Plugins/Process/Windows/Common/x64/RegisterContextWindows_x64.cpp Mon Jun  6 04:40:27 2016
@@ -136,6 +136,8 @@ RegisterInfo g_register_infos[] = {
      nullptr},
 };
 
+static size_t k_num_register_infos = llvm::array_lengthof(g_register_infos);
+
 // Array of lldb register numbers used to define the set of all General Purpose Registers
 uint32_t g_gpr_reg_indices[] = {eRegisterIndexRax, eRegisterIndexRbx,   eRegisterIndexRcx, eRegisterIndexRdx,
                                 eRegisterIndexRdi, eRegisterIndexRsi,   eRegisterIndexR8,  eRegisterIndexR9,
@@ -169,7 +171,9 @@ RegisterContextWindows_x64::GetRegisterC
 const RegisterInfo *
 RegisterContextWindows_x64::GetRegisterInfoAtIndex(size_t reg)
 {
-    return &g_register_infos[reg];
+    if (reg < k_num_register_infos)
+        return &g_register_infos[reg];
+    return NULL;
 }
 
 size_t

Modified: lldb/trunk/source/Plugins/Process/Windows/Common/x86/RegisterContextWindows_x86.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Windows/Common/x86/RegisterContextWindows_x86.cpp?rev=271876&r1=271875&r2=271876&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/Windows/Common/x86/RegisterContextWindows_x86.cpp (original)
+++ lldb/trunk/source/Plugins/Process/Windows/Common/x86/RegisterContextWindows_x86.cpp Mon Jun  6 04:40:27 2016
@@ -64,6 +64,7 @@ RegisterInfo g_register_infos[] =
     { DEFINE_GPR(eip,    "pc"),     { ehframe_eip_i386,     dwarf_eip_i386,      LLDB_REGNUM_GENERIC_PC,    LLDB_INVALID_REGNUM,  lldb_eip_i386   },  nullptr,      nullptr},
     { DEFINE_GPR_BIN(eflags, "flags"), { ehframe_eflags_i386, dwarf_eflags_i386,   LLDB_REGNUM_GENERIC_FLAGS, LLDB_INVALID_REGNUM,  lldb_eflags_i386},  nullptr,      nullptr},
 };
+static size_t k_num_register_infos = llvm::array_lengthof(g_register_infos);
 
 // Array of lldb register numbers used to define the set of all General Purpose Registers
 uint32_t g_gpr_reg_indices[] =
@@ -106,7 +107,9 @@ RegisterContextWindows_x86::GetRegisterC
 const RegisterInfo *
 RegisterContextWindows_x86::GetRegisterInfoAtIndex(size_t reg)
 {
-    return &g_register_infos[reg];
+    if (reg < k_num_register_infos)
+        return &g_register_infos[reg];
+    return NULL;
 }
 
 size_t




More information about the lldb-commits mailing list