[Lldb-commits] [lldb] r298337 - Fix two places where an arm instruction emulation method

Jason Molenda via lldb-commits lldb-commits at lists.llvm.org
Mon Mar 20 21:34:17 PDT 2017


Author: jmolenda
Date: Mon Mar 20 23:34:17 2017
New Revision: 298337

URL: http://llvm.org/viewvc/llvm-project?rev=298337&view=rev
Log:
Fix two places where an arm instruction emulation method
can dereference misaligned memory.  
<rdar://problem/31106315>, <rdar://problem/31106337>

Modified:
    lldb/trunk/source/Plugins/Instruction/ARM/EmulationStateARM.cpp

Modified: lldb/trunk/source/Plugins/Instruction/ARM/EmulationStateARM.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Instruction/ARM/EmulationStateARM.cpp?rev=298337&r1=298336&r2=298337&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Instruction/ARM/EmulationStateARM.cpp (original)
+++ lldb/trunk/source/Plugins/Instruction/ARM/EmulationStateARM.cpp Mon Mar 20 23:34:17 2017
@@ -192,15 +192,18 @@ size_t EmulationStateARM::WritePseudoMem
   EmulationStateARM *pseudo_state = (EmulationStateARM *)baton;
 
   if (length <= 4) {
-    uint32_t value = *((const uint32_t *)dst);
+    uint32_t value;
+    memcpy (&value, dst, sizeof (uint32_t));
     if (endian::InlHostByteOrder() == lldb::eByteOrderBig)
       value = llvm::ByteSwap_32(value);
 
     pseudo_state->StoreToPseudoAddress(addr, value);
     return length;
   } else if (length == 8) {
-    uint32_t value1 = ((const uint32_t *)dst)[0];
-    uint32_t value2 = ((const uint32_t *)dst)[1];
+    uint32_t value1;
+    uint32_t value2;
+    memcpy (&value1, dst, sizeof (uint32_t));
+    memcpy (&value2, (uint8_t *) dst + sizeof (uint32_t), sizeof (uint32_t));
     if (endian::InlHostByteOrder() == lldb::eByteOrderBig) {
       value1 = llvm::ByteSwap_32(value1);
       value2 = llvm::ByteSwap_32(value2);




More information about the lldb-commits mailing list