From 50455f1ab2935f7321215dfa681745c9b1cb5b19 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Thu, 1 Dec 2016 10:15:07 +0000 Subject: [PATCH] Fix seg-fault running addr2line on a corrupt binary. PR binutils/20891 * aoutx.h (find_nearest_line): Handle the case where the main file name and the directory name are both empty. --- bfd/ChangeLog | 6 ++++++ bfd/aoutx.h | 16 ++++++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index fc32759107b..8de43e032c2 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2016-12-01 Nick Clifton + + PR binutils/20891 + * aoutx.h (find_nearest_line): Handle the case where the main file + name and the directory name are both empty. + 2016-11-30 Alan Modra * elf.c (get_program_header_size): Revert accidental change. diff --git a/bfd/aoutx.h b/bfd/aoutx.h index 089fe570823..614da21a771 100644 --- a/bfd/aoutx.h +++ b/bfd/aoutx.h @@ -2666,7 +2666,7 @@ NAME (aout, find_nearest_line) (bfd *abfd, char *buf; *filename_ptr = abfd->filename; - *functionname_ptr = 0; + *functionname_ptr = NULL; *line_ptr = 0; if (disriminator_ptr) *disriminator_ptr = 0; @@ -2811,9 +2811,17 @@ NAME (aout, find_nearest_line) (bfd *abfd, *filename_ptr = main_file_name; else { - sprintf (buf, "%s%s", directory_name, main_file_name); - *filename_ptr = buf; - buf += filelen + 1; + if (buf == NULL) + /* PR binutils/20891: In a corrupt input file both + main_file_name and directory_name can be empty... */ + * filename_ptr = NULL; + else + { + snprintf (buf, filelen + 1, "%s%s", directory_name, + main_file_name); + *filename_ptr = buf; + buf += filelen + 1; + } } }