perf-tools: fix perf-buildid-cache when passing a symbolic link
PATCH 1/1 perf-tools: fix perf-buildid-cache when passing a symbolic link
From: Franck Bui-Huu <[email protected]>
This was broken since link(2) doesn't dereference symbolic links. Instead 'filename' becomes a symbolic link to the same file that 'name' refers to.
This had the bad effect to create dangling symlinks in the case that even can't be removed with perf-buildid-cache(1).
--- tools/perf/util/header.c | 10 ++++++---- 1 files changed, 6 insertions(+), 4 deletions(-)
tools/perf/util/header.c +6 -4
@@ -265,15 +265,16 @@ int build_id_cache__add_s(const char *sbuild_id, const char *debugdir, const char *name, bool is_kallsyms) { const size_t size = PATH_MAX; -char *filename =malloc (size), +char *realname =realpath (name,NULL ), + *filename =malloc (size), *linkname =malloc (size), *targetname;int len, err =-1 ; -if (filename ==NULL || linkname ==NULL ) +if (realname ==NULL || filename ==NULL || linkname ==NULL ) goto out_free; len =snprintf (filename, size,"%s%s%s" , - debugdir, is_kallsyms ?"/" :"" , name); + debugdir, is_kallsyms ?"/" :"" , realname);if (mkdir_p (filename,0755 )) goto out_free;
@@ -283,7 +284,7 @@ int build_id_cache__add_s(const char *sbuild_id, const char *debugdir,if (is_kallsyms) {if (copyfile ("/proc/kallsyms" , filename)) goto out_free; - }else if (link (name, filename) &©file (name, filename)) + }else if (link (realname, filename) &©file (name, filename)) goto out_free; }
@@ -300,6 +301,7 @@ int build_id_cache__add_s(const char *sbuild_id, const char *debugdir,if (symlink (targetname, linkname) ==0 ) err =0 ; out_free: +free (realname);free (filename);free (linkname);return err;
Signature · 1 line
1.7.3.2
[tip:perf/urgent] perf buildid-cache: Fix symbolic link handling
Commit-ID: 68a7a771ad0e2959983729bf88cbc74a7014438f Gitweb: http://git.kernel.org/tip/68a7a771ad0e2959983729bf88cbc74a7014438f Author: Franck Bui-Huu <[email protected]> AuthorDate: Fri, 10 Dec 2010 22:06:26 +0100 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Thu, 16 Dec 2010 09:41:45 -0200
perf buildid-cache: Fix symbolic link handling
This was broken since link(2) doesn't dereference symbolic links. Instead 'filename' becomes a symbolic link to the same file that 'name' refers to.
This had the bad effect to create dangling symlinks in the case that even can't be removed with perf-buildid-cache(1).
LKML-Reference: <[email protected]>
--- tools/perf/util/header.c | 10 ++++++---- 1 files changed, 6 insertions(+), 4 deletions(-)
tools/perf/util/header.c +6 -4
@@ -265,15 +265,16 @@ int build_id_cache__add_s(const char *sbuild_id, const char *debugdir, const char *name, bool is_kallsyms) { const size_t size = PATH_MAX; -char *filename =malloc (size), +char *realname =realpath (name,NULL ), + *filename =malloc (size), *linkname =malloc (size), *targetname;int len, err =-1 ; -if (filename ==NULL || linkname ==NULL ) +if (realname ==NULL || filename ==NULL || linkname ==NULL ) goto out_free; len =snprintf (filename, size,"%s%s%s" , - debugdir, is_kallsyms ?"/" :"" , name); + debugdir, is_kallsyms ?"/" :"" , realname);if (mkdir_p (filename,0755 )) goto out_free;
@@ -283,7 +284,7 @@ int build_id_cache__add_s(const char *sbuild_id, const char *debugdir,if (is_kallsyms) {if (copyfile ("/proc/kallsyms" , filename)) goto out_free; - }else if (link (name, filename) &©file (name, filename)) + }else if (link (realname, filename) &©file (name, filename)) goto out_free; }
@@ -300,6 +301,7 @@ int build_id_cache__add_s(const char *sbuild_id, const char *debugdir,if (symlink (targetname, linkname) ==0 ) err =0 ; out_free: +free (realname);free (filename);free (linkname);return err;