diff options
author | Jan Kratochvil <jan.kratochvil@redhat.com> | 2009-08-03 17:00:34 +0000 |
---|---|---|
committer | Jan Kratochvil <jan.kratochvil@redhat.com> | 2009-08-03 17:00:34 +0000 |
commit | 1ffa32eed68b02c79dfc3b5b113344ef62df7b83 (patch) | |
tree | d7a286449e2ac6e4cdc93995b7d699c88d4473f9 | |
parent | 004fb7809c1678fd59adf414497f6382e9344415 (diff) | |
download | gdb-1ffa32eed68b02c79dfc3b5b113344ef62df7b83.zip gdb-1ffa32eed68b02c79dfc3b5b113344ef62df7b83.tar.gz gdb-1ffa32eed68b02c79dfc3b5b113344ef62df7b83.tar.bz2 |
gdb/
Fix memory corruption on reread of file through a symbolic link.
* symfile.c (find_separate_debug_file): Initialize CANON_NAME earlier.
Allocate DEBUGFILE with length based on CANON_NAME. Free CANON_NAME on
all the return paths.
-rw-r--r-- | gdb/ChangeLog | 8 | ||||
-rw-r--r-- | gdb/symfile.c | 13 |
2 files changed, 19 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 4bc40b4..42c5a2d 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2009-08-03 Richard Guenther <rguenther@suse.de> + Jan Kratochvil <jan.kratochvil@redhat.com> + + Fix memory corruption on reread of file through a symbolic link. + * symfile.c (find_separate_debug_file): Initialize CANON_NAME earlier. + Allocate DEBUGFILE with length based on CANON_NAME. Free CANON_NAME on + all the return paths. + 2009-08-03 Jim Ingham <jingham@apple.com> Vladimir Prus <vladimir@codesourcery.com> diff --git a/gdb/symfile.c b/gdb/symfile.c index 36480c1..4bdab91 100644 --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -1388,8 +1388,14 @@ find_separate_debug_file (struct objfile *objfile) gdb_assert (i >= 0 && IS_DIR_SEPARATOR (dir[i])); dir[i+1] = '\0'; + /* Set I to max (strlen (canon_name), strlen (dir)). */ + canon_name = lrealpath (dir); + i = strlen (dir); + if (canon_name && strlen (canon_name) > i) + i = strlen (canon_name); + debugfile = alloca (strlen (debug_file_directory) + 1 - + strlen (dir) + + i + strlen (DEBUG_SUBDIRECTORY) + strlen ("/") + strlen (basename) @@ -1403,6 +1409,7 @@ find_separate_debug_file (struct objfile *objfile) { xfree (basename); xfree (dir); + xfree (canon_name); return xstrdup (debugfile); } @@ -1416,6 +1423,7 @@ find_separate_debug_file (struct objfile *objfile) { xfree (basename); xfree (dir); + xfree (canon_name); return xstrdup (debugfile); } @@ -1429,12 +1437,12 @@ find_separate_debug_file (struct objfile *objfile) { xfree (basename); xfree (dir); + xfree (canon_name); return xstrdup (debugfile); } /* If the file is in the sysroot, try using its base path in the global debugfile directory. */ - canon_name = lrealpath (dir); if (canon_name && strncmp (canon_name, gdb_sysroot, strlen (gdb_sysroot)) == 0 && IS_DIR_SEPARATOR (canon_name[strlen (gdb_sysroot)])) @@ -1449,6 +1457,7 @@ find_separate_debug_file (struct objfile *objfile) xfree (canon_name); xfree (basename); xfree (dir); + xfree (canon_name); return xstrdup (debugfile); } } |