perf annotate: pass filename to objdump via execl
PATCH 1/1 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.
--- tools/perf/util/annotate.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
tools/perf/util/annotate.c +4 -4
@@ -1696,15 +1696,14 @@ static int symbol__disassemble(struct symbol *sym, struct annotate_args *args) err =asprintf (&command,"%s %s%s --start-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->disassembler_style ?"-M " :"" , opts->disassembler_style ?:"" ,map__rip_2objdump (map, sym->start),map__rip_2objdump (map, sym->end), opts->show_asm_raw ?"" :"--no-show-raw" , - opts->annotate_src ?"-S" :"" , - symfs_filename, symfs_filename); + opts->annotate_src ?"-S" :"" );if (err <0 ) {pr_err ("Failure allocating memory for the command to run\n" );
@@ -1729,7 +1728,8 @@ static int symbol__disassemble(struct symbol *sym, struct annotate_args *args)close (stdout_fd[0 ]);dup2 (stdout_fd[1 ],1 );close (stdout_fd[1 ]); -execl ("/bin/sh" ,"sh" ,"-c" , command,NULL ); +execl ("/bin/sh" ,"sh" ,"-c" , command,"--" , symfs_filename, +NULL );perror (command);exit (-1 ); }
Signature · 1 line
2.11.0
Quoted 10 lines · Ivan Krylov
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 <[email protected]>
thanks,
jirka
Quoted 38 lines
--- tools/perf/util/annotate.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)tools/perf/util/annotate.c +4
-4@@ -1696,15 +1696,14 @@ static int symbol__disassemble(struct symbol *sym, struct annotate_args *args) err =asprintf (&command,"%s %s%s --start-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->disassembler_style ?"-M " :"" , opts->disassembler_style ?:"" ,map__rip_2objdump (map, sym->start),map__rip_2objdump (map, sym->end), opts->show_asm_raw ?"" :"--no-show-raw" , - opts->annotate_src ?"-S" :"" , - symfs_filename, symfs_filename); + opts->annotate_src ?"-S" :"" );if (err <0 ) {pr_err ("Failure allocating memory for the command to run\n" );@@ -1729,7 +1728,8 @@ static int symbol__disassemble(struct symbol *sym, struct annotate_args *args)close (stdout_fd[0 ]);dup2 (stdout_fd[1 ],1 );close (stdout_fd[1 ]); -execl ("/bin/sh" ,"sh" ,"-c" , command,NULL ); +execl ("/bin/sh" ,"sh" ,"-c" , command,"--" , symfs_filename, +NULL );perror (command);exit (-1 ); }Signature · 1 line
2.11.0
Quoted 1 line · On Sun, 14 Oct 2018 16:04:51 +0200 Jiri Olsa <[email protected]> wrote:
Acked-by Jiri Olsa <[email protected]>
Is there anything I could do to improve the patch? Should I wrap the path to objdump executable in a similar way?
Signature · 2 lines
Best regards, Ivan
Arnaldo Carvalho de Melo
maintainerEm Sun, Dec 30, 2018 at 05:37:43PM +0300, Ivan Krylov escreveu:
Quoted 7 lines
Quoted 1 line · On Sun, 14 Oct 2018 16:04:51 +0200 Jiri Olsa <[email protected]> wrote:
Acked-by Jiri Olsa <[email protected]>Is there anything I could do to improve the patch? Should I wrap the path to objdump executable in a similar way?
Nope, just fell thru the holidays crack, processing it now.
- Arnaldo
tip-bot for Ivan Krylov
merge bot[tip:perf/urgent] perf annotate: Pass filename to objdump via execl
In reply to Ivan Krylovperf annotate: Pass filename to objdump via execl
Commit-ID: 442b4eb3af44906fcbb526d98c314b27f8c9acf3 Gitweb: https://git.kernel.org/tip/442b4eb3af44906fcbb526d98c314b27f8c9acf3 Author: Ivan Krylov <[email protected]> AuthorDate: Sun, 14 Oct 2018 11:18:03 +0300 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Fri, 4 Jan 2019 12:54:49 -0300
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.
--- tools/perf/util/annotate.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
tools/perf/util/annotate.c +4 -4
@@ -1723,15 +1723,14 @@ static int symbol__disassemble(struct symbol *sym, struct annotate_args *args) err =asprintf (&command,"%s %s%s --start-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->disassembler_style ?"-M " :"" , opts->disassembler_style ?:"" ,map__rip_2objdump (map, sym->start),map__rip_2objdump (map, sym->end), opts->show_asm_raw ?"" :"--no-show-raw" , - opts->annotate_src ?"-S" :"" , - symfs_filename, symfs_filename); + opts->annotate_src ?"-S" :"" );if (err <0 ) {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 ]);dup2 (stdout_fd[1 ],1 );close (stdout_fd[1 ]); -execl ("/bin/sh" ,"sh" ,"-c" , command,NULL ); +execl ("/bin/sh" ,"sh" ,"-c" , command,"--" , symfs_filename, +NULL );perror (command);exit (-1 ); }