2005-09-26 Jim Blandy * dwarf2read.c (file_full_name): Cope with file numbers that are out of range for the given line header. Index: gdb/dwarf2read.c =================================================================== RCS file: /cvs/src/src/gdb/dwarf2read.c,v retrieving revision 1.183 diff -c -p -r1.183 dwarf2read.c *** gdb/dwarf2read.c 1 Aug 2005 04:06:27 -0000 1.183 --- gdb/dwarf2read.c 26 Sep 2005 22:10:05 -0000 *************** dwarf_alloc_die (void) *** 8810,8841 **** static char * file_full_name (int file, struct line_header *lh, const char *comp_dir) { ! struct file_entry *fe = &lh->file_names[file - 1]; ! ! if (IS_ABSOLUTE_PATH (fe->name)) ! return xstrdup (fe->name); ! else { ! const char *dir; ! int dir_len; ! char *full_name; ! ! if (fe->dir_index) ! dir = lh->include_dirs[fe->dir_index - 1]; else - dir = comp_dir; - - if (dir) { ! dir_len = strlen (dir); ! full_name = xmalloc (dir_len + 1 + strlen (fe->name) + 1); ! strcpy (full_name, dir); ! full_name[dir_len] = '/'; ! strcpy (full_name + dir_len + 1, fe->name); ! return full_name; } ! else ! return xstrdup (fe->name); } } --- 8810,8860 ---- static char * file_full_name (int file, struct line_header *lh, const char *comp_dir) { ! /* Is the file number a valid index into the line header's file name ! table? Remember that file numbers start with one, not zero. */ ! if (1 <= file && file <= lh->num_file_names) { ! struct file_entry *fe = &lh->file_names[file - 1]; ! ! if (IS_ABSOLUTE_PATH (fe->name)) ! return xstrdup (fe->name); else { ! const char *dir; ! int dir_len; ! char *full_name; ! ! if (fe->dir_index) ! dir = lh->include_dirs[fe->dir_index - 1]; ! else ! dir = comp_dir; ! ! if (dir) ! { ! dir_len = strlen (dir); ! full_name = xmalloc (dir_len + 1 + strlen (fe->name) + 1); ! strcpy (full_name, dir); ! full_name[dir_len] = '/'; ! strcpy (full_name + dir_len + 1, fe->name); ! return full_name; ! } ! else ! return xstrdup (fe->name); } ! } ! else ! { ! /* The compiler produced a bogus file number. We can at least ! record the macro definitions made in the file, even if we ! won't be able to find the file by name. */ ! char fake_name[80]; ! sprintf (fake_name, "", file); ! ! complaint (&symfile_complaints, ! _("bad file number in macro information (%d)"), ! file); ! ! return xstrdup (fake_name); } }