perf annotate: Pass filename to objdump via execl
The symbol__disassemble() function uses shell to launch objdump and filter its output via grep. Passing filenames by interpolating them into the command line via "%s" may lead to problems if said filenames contain special characters. Instead, pass the filename as a command line argument where it is not subject to any kind of interpretation, then use quoted shell interpolation to build the strings we need safely. Signed-off-by: Ivan Krylov <krylov.r00t@gmail.com> Acked-by: Jiri Olsa <jolsa@kernel.org> Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Link: http://lkml.kernel.org/r/20181014111803.5d83b806@Tarkus Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
a3366db06b
commit
442b4eb3af
@ -1723,15 +1723,14 @@ static int symbol__disassemble(struct symbol *sym, struct annotate_args *args)
|
|||||||
err = asprintf(&command,
|
err = asprintf(&command,
|
||||||
"%s %s%s --start-address=0x%016" PRIx64
|
"%s %s%s --start-address=0x%016" PRIx64
|
||||||
" --stop-address=0x%016" PRIx64
|
" --stop-address=0x%016" PRIx64
|
||||||
" -l -d %s %s -C \"%s\" 2>/dev/null|grep -v \"%s:\"|expand",
|
" -l -d %s %s -C \"$1\" 2>/dev/null|grep -v \"$1:\"|expand",
|
||||||
opts->objdump_path ?: "objdump",
|
opts->objdump_path ?: "objdump",
|
||||||
opts->disassembler_style ? "-M " : "",
|
opts->disassembler_style ? "-M " : "",
|
||||||
opts->disassembler_style ?: "",
|
opts->disassembler_style ?: "",
|
||||||
map__rip_2objdump(map, sym->start),
|
map__rip_2objdump(map, sym->start),
|
||||||
map__rip_2objdump(map, sym->end),
|
map__rip_2objdump(map, sym->end),
|
||||||
opts->show_asm_raw ? "" : "--no-show-raw",
|
opts->show_asm_raw ? "" : "--no-show-raw",
|
||||||
opts->annotate_src ? "-S" : "",
|
opts->annotate_src ? "-S" : "");
|
||||||
symfs_filename, symfs_filename);
|
|
||||||
|
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
pr_err("Failure allocating memory for the command to run\n");
|
pr_err("Failure allocating memory for the command to run\n");
|
||||||
@ -1756,7 +1755,8 @@ static int symbol__disassemble(struct symbol *sym, struct annotate_args *args)
|
|||||||
close(stdout_fd[0]);
|
close(stdout_fd[0]);
|
||||||
dup2(stdout_fd[1], 1);
|
dup2(stdout_fd[1], 1);
|
||||||
close(stdout_fd[1]);
|
close(stdout_fd[1]);
|
||||||
execl("/bin/sh", "sh", "-c", command, NULL);
|
execl("/bin/sh", "sh", "-c", command, "--", symfs_filename,
|
||||||
|
NULL);
|
||||||
perror(command);
|
perror(command);
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user