Skip to content

Commit

Permalink
Don't return the main file as the separate debug info
Browse files Browse the repository at this point in the history
On Fedora 35,

$ readelf -d /usr/bin/npc

caused readelf to run out of stack since load_separate_debug_info
returned the input main file as the separate debug info:

(gdb) bt
 #0  load_separate_debug_info (
    main_filename=main_filename@entry=0x510f50 "/export/home/hjl/.cache/debuginfod_client/dcc33c51c49e7dafc178fdb5cf8bd8946f965295/debuginfo",
    xlink=xlink@entry=0x4e5180 <debug_displays+4480>,
    parse_func=parse_func@entry=0x431550 <parse_gnu_debuglink>,
    check_func=check_func@entry=0x432ae0 <check_gnu_debuglink>,
    func_data=func_data@entry=0x7fffffffdb60, file=file@entry=0x51d430)
    at /export/gnu/import/git/sources/binutils-gdb/binutils/dwarf.c:11057
 #1  0x000000000043328d in check_for_and_load_links (file=0x51d430,
    filename=0x510f50 "/export/home/hjl/.cache/debuginfod_client/dcc33c51c49e7dafc178fdb5cf8bd8946f965295/debuginfo")
    at /export/gnu/import/git/sources/binutils-gdb/binutils/dwarf.c:11381
 #2  0x00000000004332ae in check_for_and_load_links (file=0x51b070,
    filename=0x518dd0 "/export/home/hjl/.cache/debuginfod_client/dcc33c51c49e7dafc178fdb5cf8bd8946f965295/debuginfo")

Return NULL if the separate debug info is the same as the input main
file to avoid infinite recursion.

	PR binutils/28679
	* dwarf.c (load_separate_debug_info): Don't return the input
	main file.
  • Loading branch information
hjl-tools committed Dec 11, 2021
1 parent 1563e71 commit 40eb8b9
Showing 1 changed file with 17 additions and 1 deletion.
18 changes: 17 additions & 1 deletion binutils/dwarf.c
Original file line number Diff line number Diff line change
Expand Up @@ -11053,6 +11053,9 @@ load_separate_debug_info (const char * main_filename,
char * canon_dir;
size_t canon_dirlen;
size_t dirlen;
char * canon_filename;
char * canon_debug_filename;
bool self;

if ((separate_filename = parse_func (xlink, func_data)) == NULL)
{
Expand All @@ -11064,7 +11067,8 @@ load_separate_debug_info (const char * main_filename,
/* Attempt to locate the separate file.
This should duplicate the logic in bfd/opncls.c:find_separate_debug_file(). */

canon_dir = lrealpath (main_filename);
canon_filename = lrealpath (main_filename);
canon_dir = xstrdup (canon_filename);

for (canon_dirlen = strlen (canon_dir); canon_dirlen > 0; canon_dirlen--)
if (IS_DIR_SEPARATOR (canon_dir[canon_dirlen - 1]))
Expand Down Expand Up @@ -11096,6 +11100,7 @@ load_separate_debug_info (const char * main_filename,
{
warn (_("Out of memory"));
free (canon_dir);
free (canon_filename);
return NULL;
}

Expand Down Expand Up @@ -11214,11 +11219,22 @@ load_separate_debug_info (const char * main_filename,

free (canon_dir);
free (debug_filename);
free (canon_filename);
return NULL;

found:
free (canon_dir);

canon_debug_filename = lrealpath (debug_filename);
self = strcmp (canon_debug_filename, canon_filename) == 0;
free (canon_filename);
free (canon_debug_filename);
if (self)
{
free (debug_filename);
return NULL;
}

void * debug_handle;

/* Now open the file.... */
Expand Down

0 comments on commit 40eb8b9

Please sign in to comment.