* symfile.c (find_separate_debug_file): Initialize dir, debugfile and
	canon_name to NULL.  Change alloca to xmalloc, newly call xfree for it.
	New label cleanup_return_debugfile, jump to it from the failure paths.
This commit is contained in:
Jan Kratochvil 2009-11-02 14:57:02 +00:00
parent 287ccc17ed
commit 25522fae98
2 changed files with 26 additions and 39 deletions

View File

@ -1,3 +1,9 @@
2009-11-02 Jan Kratochvil <jan.kratochvil@redhat.com>
* symfile.c (find_separate_debug_file): Initialize dir, debugfile and
canon_name to NULL. Change alloca to xmalloc, newly call xfree for it.
New label cleanup_return_debugfile, jump to it from the failure paths.
2009-11-02 Andrew Cagney <cagney@gnu.org>
* symfile.c (separate_debug_file_exists): When the CRCs mismatch

View File

@ -1333,11 +1333,10 @@ static char *
find_separate_debug_file (struct objfile *objfile)
{
asection *sect;
char *basename;
char *dir;
char *debugfile;
char *name_copy;
char *canon_name;
char *basename, *name_copy;
char *dir = NULL;
char *debugfile = NULL;
char *canon_name = NULL;
bfd_size_type debuglink_size;
unsigned long crc32;
int i;
@ -1366,7 +1365,7 @@ find_separate_debug_file (struct objfile *objfile)
if (basename == NULL)
/* There's no separate debug info, hence there's no way we could
load it => no warning. */
return NULL;
goto cleanup_return_debugfile;
dir = xstrdup (objfile->name);
@ -1388,24 +1387,19 @@ find_separate_debug_file (struct objfile *objfile)
if (canon_name && strlen (canon_name) > i)
i = strlen (canon_name);
debugfile = alloca (strlen (debug_file_directory) + 1
+ i
+ strlen (DEBUG_SUBDIRECTORY)
+ strlen ("/")
+ strlen (basename)
+ 1);
debugfile = xmalloc (strlen (debug_file_directory) + 1
+ i
+ strlen (DEBUG_SUBDIRECTORY)
+ strlen ("/")
+ strlen (basename)
+ 1);
/* First try in the same directory as the original file. */
strcpy (debugfile, dir);
strcat (debugfile, basename);
if (separate_debug_file_exists (debugfile, crc32, objfile->name))
{
xfree (basename);
xfree (dir);
xfree (canon_name);
return xstrdup (debugfile);
}
goto cleanup_return_debugfile;
/* Then try in the subdirectory named DEBUG_SUBDIRECTORY. */
strcpy (debugfile, dir);
@ -1414,12 +1408,7 @@ find_separate_debug_file (struct objfile *objfile)
strcat (debugfile, basename);
if (separate_debug_file_exists (debugfile, crc32, objfile->name))
{
xfree (basename);
xfree (dir);
xfree (canon_name);
return xstrdup (debugfile);
}
goto cleanup_return_debugfile;
/* Then try in the global debugfile directory. */
strcpy (debugfile, debug_file_directory);
@ -1428,12 +1417,7 @@ find_separate_debug_file (struct objfile *objfile)
strcat (debugfile, basename);
if (separate_debug_file_exists (debugfile, crc32, objfile->name))
{
xfree (basename);
xfree (dir);
xfree (canon_name);
return xstrdup (debugfile);
}
goto cleanup_return_debugfile;
/* If the file is in the sysroot, try using its base path in the
global debugfile directory. */
@ -1447,20 +1431,17 @@ find_separate_debug_file (struct objfile *objfile)
strcat (debugfile, basename);
if (separate_debug_file_exists (debugfile, crc32, objfile->name))
{
xfree (canon_name);
xfree (basename);
xfree (dir);
return xstrdup (debugfile);
}
goto cleanup_return_debugfile;
}
if (canon_name)
xfree (canon_name);
xfree (debugfile);
debugfile = NULL;
cleanup_return_debugfile:
xfree (canon_name);
xfree (basename);
xfree (dir);
return NULL;
return debugfile;
}