Loading...
mach_o/DwarfDebug.cpp dyld-1235.2 dyld-1330
--- dyld/dyld-1235.2/mach_o/DwarfDebug.cpp
+++ dyld/dyld-1330/mach_o/DwarfDebug.cpp
@@ -251,8 +251,10 @@
             sz = 8;
             break;
         case DW_FORM_string:
-            while (offset != end && *offset)
-                ++offset;
+            if ( offset == end )
+                return false;
+            // rdar://124698722 (off-by-one error when decoding DW_FORM_string)
+            offset += strnlen((char*)offset, (end-offset-1)) + 1;
             return true;
         case DW_FORM_data1:
         case DW_FORM_flag:
@@ -261,6 +263,7 @@
             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)
@@ -270,13 +273,15 @@
         case DW_FORM_sdata:
         case DW_FORM_udata:
         case DW_FORM_ref_udata:
-            read_uleb128(offset, end, malformed);
-            return true;
+            sz = read_uleb128(offset, end, malformed);
+            return true; // offset already updated by read_uleb128()
+            break;
         case DW_FORM_addrx:
         case DW_FORM_strx:
         case DW_FORM_rnglistx:
             sz = read_uleb128(offset, end, malformed);
-            return true;
+            return true; // offset already updated by read_uleb128()
+            break;
         case DW_FORM_addrx1:
         case DW_FORM_strx1:
             sz = 1;
@@ -302,6 +307,7 @@
             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;