Fix broken filename for .gcda files starting with '..' (PR gcov-profile/88994).
authorMartin Liska <mliska@suse.cz>
Thu, 24 Jan 2019 08:27:39 +0000 (09:27 +0100)
committerMartin Liska <marxin@gcc.gnu.org>
Thu, 24 Jan 2019 08:27:39 +0000 (08:27 +0000)
2019-01-24  Martin Liska  <mliska@suse.cz>

PR gcov-profile/88994
* gcov-io.c (mangle_path): Do not allocate a bigger buffer,
result will be always smaller or equal to the original.
* gcov.c (mangle_name): Fix else branch where we should
also copy to PTR and shift the pointer.

From-SVN: r268233

gcc/ChangeLog
gcc/gcov-io.c
gcc/gcov.c

index 56dbfa0ea3d0ad30729d47d029b2c72568ad6c41..f7013b71eadaf1173ee16ea4c44afc5a1043d619 100644 (file)
@@ -1,3 +1,11 @@
+2019-01-24  Martin Liska  <mliska@suse.cz>
+
+       PR gcov-profile/88994
+       * gcov-io.c (mangle_path): Do not allocate a bigger buffer,
+       result will be always smaller or equal to the original.
+       * gcov.c (mangle_name): Fix else branch where we should
+       also copy to PTR and shift the pointer.
+
 2019-01-24  Xiong Hu Luo  <luoxhu@linux.vnet.ibm.com>
 
        * tree-ssa-dom.c (test_for_singularity): fix a comment typo.
index e3b1c5ce7aea0e753336480c3b93c3072091f872..1f8ac375931ce16c5c3e0447c23077a2642003b2 100644 (file)
@@ -547,7 +547,7 @@ mangle_path (char const *base)
   /* Convert '/' to '#', convert '..' to '^',
      convert ':' to '~' on DOS based file system.  */
   const char *probe;
-  char *buffer = (char *)xmalloc (strlen (base) + 10);
+  char *buffer = (char *)xmalloc (strlen (base) + 1);
   char *ptr = buffer;
 
 #if HAVE_DOS_BASED_FILE_SYSTEM
index b8ce1ee0e096eb90d1a43dc0a5d5bf24c8be86f3..cb6bc7ef85f7bd9c8e808f541e892a18fc5d0a50 100644 (file)
@@ -2520,6 +2520,9 @@ make_gcov_file_name (const char *input_name, const char *src_name)
   return result;
 }
 
+/* Mangle BASE name, copy it at the beginning of PTR buffer and
+   return address of the \0 character of the buffer.  */
+
 static char *
 mangle_name (char const *base, char *ptr)
 {
@@ -2527,14 +2530,13 @@ mangle_name (char const *base, char *ptr)
 
   /* Generate the source filename part.  */
   if (!flag_preserve_paths)
-    {
-      base = lbasename (base);
-      len = strlen (base);
-      memcpy (ptr, base, len);
-      ptr += len;
-    }
+    base = lbasename (base);
   else
-    ptr = mangle_path (base);
+    base = mangle_path (base);
+
+  len = strlen (base);
+  memcpy (ptr, base, len);
+  ptr += len;
 
   return ptr;
 }