From: Alan Modra Date: Thu, 25 Jan 2024 22:44:13 +0000 (+1030) Subject: Assertion failure dumping .eh_frame_hdr X-Git-Tag: gdb-15-branchpoint~1142 X-Git-Url: http://git.ipfire.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=e14f7abaf81d5d0aa7898570024286de8c188817;p=thirdparty%2Fbinutils-gdb.git Assertion failure dumping .eh_frame_hdr 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. --- diff --git a/binutils/dwarf.c b/binutils/dwarf.c index a30bc1cb9ab..1947ab180ee 100644 --- a/binutils/dwarf.c +++ b/binutils/dwarf.c @@ -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: