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


_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to