Loading...
mach_o/DwarfDebug.cpp dyld-1340 dyld-1162
--- 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];