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: <m38vzxxrql.fsf@gmail.com>
Signed-off-by: Franck Bui-Huu <fbuihuu@gmail.com>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by Franck Bui-Huu and committed by Arnaldo Carvalho de Melo 68a7a771 c3a34e06

+6 -4
+6 -4
tools/perf/util/header.c
··· 265 265 const char *name, bool is_kallsyms) 266 266 { 267 267 const size_t size = PATH_MAX; 268 - char *filename = malloc(size), 268 + char *realname = realpath(name, NULL), 269 + *filename = malloc(size), 269 270 *linkname = malloc(size), *targetname; 270 271 int len, err = -1; 271 272 272 - if (filename == NULL || linkname == NULL) 273 + if (realname == NULL || filename == NULL || linkname == NULL) 273 274 goto out_free; 274 275 275 276 len = snprintf(filename, size, "%s%s%s", 276 - debugdir, is_kallsyms ? "/" : "", name); 277 + debugdir, is_kallsyms ? "/" : "", realname); 277 278 if (mkdir_p(filename, 0755)) 278 279 goto out_free; 279 280 ··· 284 283 if (is_kallsyms) { 285 284 if (copyfile("/proc/kallsyms", filename)) 286 285 goto out_free; 287 - } else if (link(name, filename) && copyfile(name, filename)) 286 + } else if (link(realname, filename) && copyfile(name, filename)) 288 287 goto out_free; 289 288 } 290 289 ··· 301 300 if (symlink(targetname, linkname) == 0) 302 301 err = 0; 303 302 out_free: 303 + free(realname); 304 304 free(filename); 305 305 free(linkname); 306 306 return err;