mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-21 02:24:17 +08:00
gprofng: fix SIGSEGV when processing unusual dwarf
gprofng/ChangeLog 2023-02-07 Vladimir Mezentsev <vladimir.mezentsev@oracle.com> PR gprofng/30093 * src/Dwarf.cc: add nullptr check. * src/DwarfLib.cc: Likewise.
This commit is contained in:
@ -606,6 +606,8 @@ Dwarf::archive_Dwarf (LoadObject *lo)
|
|||||||
{
|
{
|
||||||
mod->hdrOffset = dwrCUs->size ();
|
mod->hdrOffset = dwrCUs->size ();
|
||||||
DwrLineRegs *lineReg = dwrCU->get_dwrLineReg ();
|
DwrLineRegs *lineReg = dwrCU->get_dwrLineReg ();
|
||||||
|
if (lineReg != NULL)
|
||||||
|
{
|
||||||
dwrCU->srcFiles = new Vector<SourceFile *> (VecSize (lineReg->file_names));
|
dwrCU->srcFiles = new Vector<SourceFile *> (VecSize (lineReg->file_names));
|
||||||
for (long i = 0, sz = VecSize (lineReg->file_names); i < sz; i++)
|
for (long i = 0, sz = VecSize (lineReg->file_names); i < sz; i++)
|
||||||
{
|
{
|
||||||
@ -613,6 +615,7 @@ Dwarf::archive_Dwarf (LoadObject *lo)
|
|||||||
SourceFile *sf = mod->findSource (fname, true);
|
SourceFile *sf = mod->findSource (fname, true);
|
||||||
dwrCU->srcFiles->append (sf);
|
dwrCU->srcFiles->append (sf);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Dwarf_cnt ctx;
|
Dwarf_cnt ctx;
|
||||||
ctx.module = mod;
|
ctx.module = mod;
|
||||||
@ -986,9 +989,6 @@ DwrCU::append_Function (Dwarf_cnt *ctx)
|
|||||||
if (lineno > 0)
|
if (lineno > 0)
|
||||||
{
|
{
|
||||||
func->setLineFirst (lineno);
|
func->setLineFirst (lineno);
|
||||||
if (dwrLineReg == NULL)
|
|
||||||
dwrLineReg = new DwrLineRegs (new DwrSec (dwarf->debug_lineSec,
|
|
||||||
stmt_list_offset), comp_dir);
|
|
||||||
int fileno = ((int) Dwarf_data (DW_AT_decl_file)) - 1;
|
int fileno = ((int) Dwarf_data (DW_AT_decl_file)) - 1;
|
||||||
SourceFile *sf = ((fileno >= 0) && (fileno < VecSize (srcFiles))) ? srcFiles->get (fileno)
|
SourceFile *sf = ((fileno >= 0) && (fileno < VecSize (srcFiles))) ? srcFiles->get (fileno)
|
||||||
: module->getMainSrc ();
|
: module->getMainSrc ();
|
||||||
|
@ -31,6 +31,7 @@
|
|||||||
#include "DbeArray.h"
|
#include "DbeArray.h"
|
||||||
#include "DbeSession.h"
|
#include "DbeSession.h"
|
||||||
|
|
||||||
|
#define NO_STMT_LIST ((uint64_t) -1)
|
||||||
#define CASE_S(x) case x: s = (char *) #x; break
|
#define CASE_S(x) case x: s = (char *) #x; break
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
@ -1557,9 +1558,12 @@ DwrLineRegs::getPath (int fn)
|
|||||||
if (*dir != '/')
|
if (*dir != '/')
|
||||||
{ // not absolute
|
{ // not absolute
|
||||||
char *s = include_directories->fetch (0);
|
char *s = include_directories->fetch (0);
|
||||||
|
if (s != NULL && *s != 0)
|
||||||
|
{
|
||||||
sb.append (s);
|
sb.append (s);
|
||||||
sb.append ('/');
|
sb.append ('/');
|
||||||
}
|
}
|
||||||
|
}
|
||||||
sb.append (dir);
|
sb.append (dir);
|
||||||
sb.append ('/');
|
sb.append ('/');
|
||||||
sb.append (fnp->fname);
|
sb.append (fnp->fname);
|
||||||
@ -1590,7 +1594,7 @@ DwrCU::DwrCU (Dwarf *_dwarf)
|
|||||||
abbrevTable = NULL;
|
abbrevTable = NULL;
|
||||||
dwrInlinedSubrs = NULL;
|
dwrInlinedSubrs = NULL;
|
||||||
srcFiles = NULL;
|
srcFiles = NULL;
|
||||||
stmt_list_offset = 0;
|
stmt_list_offset = NO_STMT_LIST;
|
||||||
dwrLineReg = NULL;
|
dwrLineReg = NULL;
|
||||||
isMemop = false;
|
isMemop = false;
|
||||||
isGNU = false;
|
isGNU = false;
|
||||||
@ -1857,7 +1861,9 @@ DwrCU::parse_cu_header (LoadObject *lo)
|
|||||||
char *name = Dwarf_string (DW_AT_name);
|
char *name = Dwarf_string (DW_AT_name);
|
||||||
if (name == NULL)
|
if (name == NULL)
|
||||||
name = NTXT ("UnnamedUnit");
|
name = NTXT ("UnnamedUnit");
|
||||||
stmt_list_offset = Dwarf_data (DW_AT_stmt_list);
|
int64_t v;
|
||||||
|
if (read_data_attr(DW_AT_stmt_list, &v) == DW_DLV_OK)
|
||||||
|
stmt_list_offset = v;
|
||||||
comp_dir = dbe_strdup (Dwarf_string (DW_AT_comp_dir));
|
comp_dir = dbe_strdup (Dwarf_string (DW_AT_comp_dir));
|
||||||
char *dir_name = comp_dir ? StrChr (comp_dir, ':') : NULL;
|
char *dir_name = comp_dir ? StrChr (comp_dir, ':') : NULL;
|
||||||
char *orig_name = Dwarf_string (DW_AT_SUN_original_name);
|
char *orig_name = Dwarf_string (DW_AT_SUN_original_name);
|
||||||
@ -2073,6 +2079,8 @@ DwrCU::map_dwarf_lines (Module *mod)
|
|||||||
Stabs::is_fortran (mod->lang_code));
|
Stabs::is_fortran (mod->lang_code));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (lineReg == NULL)
|
||||||
|
return;
|
||||||
Vector<DwrLine *> *lines = lineReg->get_lines ();
|
Vector<DwrLine *> *lines = lineReg->get_lines ();
|
||||||
|
|
||||||
Include *includes = new Include;
|
Include *includes = new Include;
|
||||||
@ -2083,7 +2091,7 @@ DwrCU::map_dwarf_lines (Module *mod)
|
|||||||
for (long i = 0, sz = VecSize (lines); i < sz; i++)
|
for (long i = 0, sz = VecSize (lines); i < sz; i++)
|
||||||
{
|
{
|
||||||
DwrLine *dwrLine = lines->get (i);
|
DwrLine *dwrLine = lines->get (i);
|
||||||
char *filename = dwrLineReg->getPath (dwrLine->file);
|
char *filename = lineReg->getPath (dwrLine->file);
|
||||||
if (filename == NULL)
|
if (filename == NULL)
|
||||||
continue;
|
continue;
|
||||||
uint64_t pc = dwrLine->address;
|
uint64_t pc = dwrLine->address;
|
||||||
@ -2123,7 +2131,7 @@ DwrCU::map_dwarf_lines (Module *mod)
|
|||||||
DwrLineRegs *
|
DwrLineRegs *
|
||||||
DwrCU::get_dwrLineReg ()
|
DwrCU::get_dwrLineReg ()
|
||||||
{
|
{
|
||||||
if (dwrLineReg == NULL)
|
if (dwrLineReg == NULL && stmt_list_offset != NO_STMT_LIST)
|
||||||
dwrLineReg = new DwrLineRegs (new DwrSec (dwarf->debug_lineSec,
|
dwrLineReg = new DwrLineRegs (new DwrSec (dwarf->debug_lineSec,
|
||||||
stmt_list_offset), comp_dir);
|
stmt_list_offset), comp_dir);
|
||||||
return dwrLineReg;
|
return dwrLineReg;
|
||||||
|
Reference in New Issue
Block a user