Fix two places where an arm instruction emulation method

can dereference misaligned memory.  
<rdar://problem/31106315>, <rdar://problem/31106337>

llvm-svn: 298337
This commit is contained in:
Jason Molenda 2017-03-21 04:34:17 +00:00
parent 23be94599d
commit 3724ae4e70
1 changed files with 6 additions and 3 deletions

View File

@ -192,15 +192,18 @@ size_t EmulationStateARM::WritePseudoMemory(
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);