OSDN Git Service

gdb/
authorjkratoch <jkratoch>
Mon, 3 Aug 2009 17:00:28 +0000 (17:00 +0000)
committerjkratoch <jkratoch>
Mon, 3 Aug 2009 17:00:28 +0000 (17:00 +0000)
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.

gdb/ChangeLog
gdb/symfile.c

index 4bc40b4..42c5a2d 100644 (file)
@@ -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>
 
index 36480c1..4bdab91 100644 (file)
@@ -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);
        }
     }