Loading...
--- dyld/dyld-1340/mach_o/DwarfDebug.cpp
+++ dyld/dyld-1162/mach_o/DwarfDebug.cpp
@@ -55,9 +55,7 @@
while ((uint64_t)(next_cu - debug_info) < _debugInfo.size() ) {
const uint8_t* di = next_cu;
- uint32_t sz32;
- memcpy(&sz32, di, 4); // support unaligned loads
- uint64_t sz = sz32;
+ uint64_t sz = *(uint32_t*)di;
di += 4;
const bool dwarf64 = (sz == 0xffffffff);
if (dwarf64) {
@@ -71,8 +69,7 @@
next_cu = di + sz;
- uint16_t vers;
- memcpy(&vers, di, 2); // support unaligned loads
+ uint16_t vers = *(uint16_t*)di;
if (vers < 2 || vers > 5) {
// DWARF version wrong for this code.
// Chances are we could continue anyway, but we don't know for sure.
@@ -107,17 +104,8 @@
} else // zero-initialize address_size to silence uninitialized variable warning
address_size = 0;
// Find the debug_abbrev section
- uint64_t abbrev_base;
- if ( dwarf64 ) {
- memcpy(&abbrev_base, di, 8);
- di += 8;
- }
- else {
- uint32_t base32;
- memcpy(&base32, di, 4);
- di += 4;
- abbrev_base = base32;
- }
+ uint64_t abbrev_base = dwarf64 ? *(uint64_t*)di : *(uint32_t*)di;
+ di += dwarf64 ? 8 : 4;
if (abbrev_base > _debugInfo.size())
return;
@@ -251,10 +239,8 @@
sz = 8;
break;
case DW_FORM_string:
- if ( offset == end )
- return false;
- // rdar://124698722 (off-by-one error when decoding DW_FORM_string)
- offset += strnlen((char*)offset, (end-offset-1)) + 1;
+ while (offset != end && *offset)
+ ++offset;
return true;
case DW_FORM_data1:
case DW_FORM_flag:
@@ -263,7 +249,6 @@
break;
case DW_FORM_block:
sz = read_uleb128(offset, end, malformed);
- return true; // offset already updated by read_uleb128()
break;
case DW_FORM_block1:
if (offset == end)
@@ -273,15 +258,13 @@
case DW_FORM_sdata:
case DW_FORM_udata:
case DW_FORM_ref_udata:
- sz = read_uleb128(offset, end, malformed);
- return true; // offset already updated by read_uleb128()
- break;
+ read_uleb128(offset, end, malformed);
+ return true;
case DW_FORM_addrx:
case DW_FORM_strx:
case DW_FORM_rnglistx:
sz = read_uleb128(offset, end, malformed);
- return true; // offset already updated by read_uleb128()
- break;
+ return true;
case DW_FORM_addrx1:
case DW_FORM_strx1:
sz = 1;
@@ -307,7 +290,6 @@
break;
case DW_FORM_exprloc:
sz = read_uleb128(offset, end, malformed);
- return true; // offset already updated by read_uleb128()
break;
case DW_FORM_flag_present:
sz = 0;
@@ -328,7 +310,6 @@
const char* DwarfDebug::getDwarfString(uint64_t form, const uint8_t*& di, bool dwarf64)
{
uint32_t offset;
- uint16_t off16;
const char* dwarfStrings;
const char* result = NULL;
switch (form) {
@@ -342,18 +323,17 @@
result = getStrxString(offset, dwarf64);
break;
case DW_FORM_strx2:
- memcpy(&off16, di, 2);
- offset = off16;
+ offset = *((uint16_t*)di);
di += 2;
result = getStrxString(offset, dwarf64);
break;
case DW_FORM_strx4:
- memcpy(&offset, di, 4);
+ offset = *((uint32_t*)di);
di += 4;
result = getStrxString(offset, dwarf64);
break;
case DW_FORM_strp:
- memcpy(&offset, di, 4);
+ offset = *((uint32_t*)di);
dwarfStrings = (char*)_strings.data();
if ( offset < _strings.size() )
result = &dwarfStrings[offset];