diff options
Diffstat (limited to 'tools/perf/builtin-annotate.c')
| -rw-r--r-- | tools/perf/builtin-annotate.c | 14 | 
1 files changed, 14 insertions, 0 deletions
diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c index 1dba568e194..5e17de984dc 100644 --- a/tools/perf/builtin-annotate.c +++ b/tools/perf/builtin-annotate.c @@ -31,6 +31,7 @@ static char		*vmlinux = "vmlinux";  static char		default_sort_order[] = "comm,symbol";  static char		*sort_order = default_sort_order; +static int		force;  static int		input;  static int		show_mask = SHOW_KERNEL | SHOW_USER | SHOW_HV; @@ -980,6 +981,13 @@ process_fork_event(event_t *event, unsigned long offset, unsigned long head)  		(void *)(long)(event->header.size),  		event->fork.pid, event->fork.ppid); +	/* +	 * A thread clone will have the same PID for both +	 * parent and child. +	 */ +	if (thread == parent) +		return 0; +  	if (!thread || !parent || thread__fork(thread, parent)) {  		dprintf("problem processing PERF_EVENT_FORK, skipping event.\n");  		return -1; @@ -1327,6 +1335,11 @@ static int __cmd_annotate(void)  		exit(-1);  	} +	if (!force && (stat.st_uid != geteuid())) { +		fprintf(stderr, "file: %s not owned by current user\n", input_name); +		exit(-1); +	} +  	if (!stat.st_size) {  		fprintf(stderr, "zero-sized file, nothing to do!\n");  		exit(0); @@ -1432,6 +1445,7 @@ static const struct option options[] = {  		    "input file name"),  	OPT_STRING('s', "symbol", &sym_hist_filter, "symbol",  		    "symbol to annotate"), +	OPT_BOOLEAN('f', "force", &force, "don't complain, do it"),  	OPT_BOOLEAN('v', "verbose", &verbose,  		    "be more verbose (show symbol address, etc)"),  	OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace,  | 
