]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Assertion failure dumping .eh_frame_hdr
authorAlan Modra <amodra@gmail.com>
Thu, 25 Jan 2024 22:44:13 +0000 (09:14 +1030)
committerAlan Modra <amodra@gmail.com>
Fri, 26 Jan 2024 06:49:45 +0000 (17:19 +1030)
dwarf.c can hit "Assertion '(start) <= (end)' failed" on truncated
sections, due to get_encoded_eh_value wrongly returning a full count
for truncated words.

* dwarf.c (get_encoded_eh_value): Return zero for truncated words.

binutils/dwarf.c

index a30bc1cb9abeb563de2ac2f41a28d48496184846..1947ab180eebc858ce0f0cbd95aa1704cef8eb4d 100644 (file)
@@ -9236,37 +9236,37 @@ get_encoded_eh_value (unsigned int     encoding,
     case DW_EH_PE_udata2:
       old_start = start;
       SAFE_BYTE_GET_AND_INC (val, start, 2, end);
-      len = (start == old_start) ? 0 : 2;
+      len = start - old_start == 2 ? 2 : 0;
       break;
 
     case DW_EH_PE_udata4:
       old_start = start;
       SAFE_BYTE_GET_AND_INC (val, start, 4, end);
-      len = (start == old_start) ? 0 : 4;
+      len = start - old_start == 4 ? 4 : 0;
       break;
 
     case DW_EH_PE_udata8:
       old_start = start;
       SAFE_BYTE_GET_AND_INC (val, start, 8, end);
-      len = (start == old_start) ? 0 : 8;
+      len = start - old_start == 8 ? 8 : 0;
       break;
 
     case DW_EH_PE_sdata2:
       old_start = start;
       SAFE_SIGNED_BYTE_GET_AND_INC (val, start, 2, end);
-      len = (start == old_start) ? 0 : 2;
+      len = start - old_start == 2 ? 2 : 0;
       break;
 
     case DW_EH_PE_sdata4:
       old_start = start;
       SAFE_SIGNED_BYTE_GET_AND_INC (val, start, 4, end);
-      len = (start == old_start) ? 0 : 4;
+      len = start - old_start == 4 ? 4 : 0;
       break;
 
     case DW_EH_PE_sdata8:
       old_start = start;
       SAFE_SIGNED_BYTE_GET_AND_INC (val, start, 8, end);
-      len = (start == old_start) ? 0 : 8;
+      len = start - old_start == 8 ? 8 : 0;
       break;
 
     default: