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); _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits