[binutils-gdb] Assertion failure dumping .eh_frame_hdr

Alan Modra amodra@sourceware.org
Fri Jan 26 06:50:25 GMT 2024


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=e14f7abaf81d5d0aa7898570024286de8c188817

commit e14f7abaf81d5d0aa7898570024286de8c188817
Author: Alan Modra <amodra@gmail.com>
Date:   Fri Jan 26 09:14:13 2024 +1030

    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:
---
 binutils/dwarf.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

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:


More information about the Binutils-cvs mailing list