[binutils-gdb] Fix 32110 gprofng segfaults on parsing DWARF of clang++ 18.1.3 produced binary

Vladimir Mezentsev vmezents@sourceware.org
Sun Oct 13 20:07:38 GMT 2024


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

commit d9252a0459d2d62eeca3213264c67bde23c679bd
Author: Vladimir Mezentsev <vladimir.mezentsev@oracle.com>
Date:   Thu Oct 10 14:15:51 2024 -0700

    Fix 32110 gprofng segfaults on parsing DWARF of clang++ 18.1.3 produced binary
    
    gprofng does not handle DW_FORM_strx1* forms correctly.
    
    gprofng/ChangeLog
    2024-10-10  Vladimir Mezentsev  <vladimir.mezentsev@oracle.com>
    
            PR 32110
            * src/DwarfLib.cc: Handle DW_FORM_strx* forms.

Diff:
---
 gprofng/src/DwarfLib.cc | 38 +++++++++++++++++++++++++++++++++-----
 1 file changed, 33 insertions(+), 5 deletions(-)

diff --git a/gprofng/src/DwarfLib.cc b/gprofng/src/DwarfLib.cc
index 18c47a4ee95..a150c76cdd5 100644
--- a/gprofng/src/DwarfLib.cc
+++ b/gprofng/src/DwarfLib.cc
@@ -1006,6 +1006,10 @@ Dwr_Tag::dump ()
 	case DW_FORM_string:
 	case DW_FORM_line_strp:
 	case DW_FORM_strp_sup:
+	case DW_FORM_strx1:
+	case DW_FORM_strx2:
+	case DW_FORM_strx3:
+	case DW_FORM_strx4:
 	case DW_FORM_implicit_const:
 	  Dprintf (DUMP_DWARFLIB, "  \"%s\"", atrp->u.str ? atrp->u.str : "<NULL>");
 	  break;
@@ -1018,6 +1022,15 @@ Dwr_Tag::dump ()
 		   atrp->u.str);
 	  break;
 	case DW_FORM_addr:
+	case DW_FORM_addrx:
+	case DW_FORM_addrx1:
+	case DW_FORM_addrx2:
+	case DW_FORM_addrx3:
+	case DW_FORM_addrx4:
+	case DW_FORM_ref_sup4:
+	case DW_FORM_ref_sup8:
+	case DW_FORM_loclistx:
+	case DW_FORM_rnglistx:
 	case DW_FORM_data2:
 	case DW_FORM_data4:
 	case DW_FORM_data8:
@@ -2058,25 +2071,40 @@ DwrCU::set_die (Dwarf_Die die)
 	  (void) debug_infoSec->Get_64 ();
 	  break;
 	case DW_FORM_addrx:
-	case DW_FORM_strx:
 	case DW_FORM_loclistx:
 	case DW_FORM_rnglistx:
 	  atf->u.offset = debug_infoSec->GetULEB128 ();
 	  break;
-	case DW_FORM_addrx1:
+	case DW_FORM_strx:
+	  atf->u.offset = debug_infoSec->GetULEB128 ();
+	  atf->u.str = get_string (dwarf->debug_strSec, atf->u.offset);
+	  break;
 	case DW_FORM_strx1:
 	  atf->u.offset = debug_infoSec->Get_8 ();
+	  atf->u.str = get_string (dwarf->debug_strSec, atf->u.offset);
 	  break;
-	case DW_FORM_addrx2:
 	case DW_FORM_strx2:
 	  atf->u.offset = debug_infoSec->Get_16 ();
+	  atf->u.str = get_string (dwarf->debug_strSec, atf->u.offset);
 	  break;
-	case DW_FORM_addrx3:
 	case DW_FORM_strx3:
 	  atf->u.offset = debug_infoSec->Get_24 ();
+	  atf->u.str = get_string (dwarf->debug_strSec, atf->u.offset);
 	  break;
-	case DW_FORM_addrx4:
 	case DW_FORM_strx4:
+	  atf->u.offset = debug_infoSec->Get_32 ();
+	  atf->u.str = get_string (dwarf->debug_strSec, atf->u.offset);
+	  break;
+	case DW_FORM_addrx1:
+	  atf->u.offset = debug_infoSec->Get_8 ();
+	  break;
+	case DW_FORM_addrx2:
+	  atf->u.offset = debug_infoSec->Get_16 ();
+	  break;
+	case DW_FORM_addrx3:
+	  atf->u.offset = debug_infoSec->Get_24 ();
+	  break;
+	case DW_FORM_addrx4:
 	case DW_FORM_ref_sup4:
 	  atf->u.offset = debug_infoSec->Get_32 ();
 	  break;


More information about the Binutils-cvs mailing list