diff options
author | Masami Hiramatsu <mhiramat@redhat.com> | 2010-04-14 18:39:42 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2010-04-14 16:41:21 -0400 |
commit | d3b63d7ae04879a817bac5c0bf09749f73629d32 (patch) | |
tree | 80501b4ed6110221160b9486dd24b480c3424f41 /tools/perf/util/probe-event.c | |
parent | dd259c5db26ccda46409dbf6efc79d5a2b259e38 (diff) |
perf probe: Fix a bug that --line range can be overflow
Since line_finder.lno_s/e are signed int but line_range.start/end
are unsigned int, it is possible to be overflow when converting
line_range->start/end to line_finder->lno_s/e.
This changes line_range.start/end and line_list.line to signed int
and adds overflow checks when setting line_finder.lno_s/e.
LKML-Reference: <20100414223942.14630.72730.stgit@localhost6.localdomain6>
Signed-off-by: Masami Hiramatsu <mhiramat@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/util/probe-event.c')
-rw-r--r-- | tools/perf/util/probe-event.c | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c index 6d438391bae5..954ca210e4b7 100644 --- a/tools/perf/util/probe-event.c +++ b/tools/perf/util/probe-event.c | |||
@@ -189,7 +189,7 @@ static int try_to_find_kprobe_trace_events(struct perf_probe_event *pev, | |||
189 | #define LINEBUF_SIZE 256 | 189 | #define LINEBUF_SIZE 256 |
190 | #define NR_ADDITIONAL_LINES 2 | 190 | #define NR_ADDITIONAL_LINES 2 |
191 | 191 | ||
192 | static int show_one_line(FILE *fp, unsigned int l, bool skip, bool show_num) | 192 | static int show_one_line(FILE *fp, int l, bool skip, bool show_num) |
193 | { | 193 | { |
194 | char buf[LINEBUF_SIZE]; | 194 | char buf[LINEBUF_SIZE]; |
195 | const char *color = PERF_COLOR_BLUE; | 195 | const char *color = PERF_COLOR_BLUE; |
@@ -198,7 +198,7 @@ static int show_one_line(FILE *fp, unsigned int l, bool skip, bool show_num) | |||
198 | goto error; | 198 | goto error; |
199 | if (!skip) { | 199 | if (!skip) { |
200 | if (show_num) | 200 | if (show_num) |
201 | fprintf(stdout, "%7u %s", l, buf); | 201 | fprintf(stdout, "%7d %s", l, buf); |
202 | else | 202 | else |
203 | color_fprintf(stdout, color, " %s", buf); | 203 | color_fprintf(stdout, color, " %s", buf); |
204 | } | 204 | } |
@@ -231,7 +231,7 @@ error: | |||
231 | */ | 231 | */ |
232 | int show_line_range(struct line_range *lr) | 232 | int show_line_range(struct line_range *lr) |
233 | { | 233 | { |
234 | unsigned int l = 1; | 234 | int l = 1; |
235 | struct line_node *ln; | 235 | struct line_node *ln; |
236 | FILE *fp; | 236 | FILE *fp; |
237 | int fd, ret; | 237 | int fd, ret; |
@@ -340,16 +340,15 @@ int parse_line_range_desc(const char *arg, struct line_range *lr) | |||
340 | */ | 340 | */ |
341 | ptr = strchr(arg, ':'); | 341 | ptr = strchr(arg, ':'); |
342 | if (ptr) { | 342 | if (ptr) { |
343 | lr->start = (unsigned int)strtoul(ptr + 1, &tmp, 0); | 343 | lr->start = (int)strtoul(ptr + 1, &tmp, 0); |
344 | if (*tmp == '+') | 344 | if (*tmp == '+') |
345 | lr->end = lr->start + (unsigned int)strtoul(tmp + 1, | 345 | lr->end = lr->start + (int)strtoul(tmp + 1, &tmp, 0); |
346 | &tmp, 0); | ||
347 | else if (*tmp == '-') | 346 | else if (*tmp == '-') |
348 | lr->end = (unsigned int)strtoul(tmp + 1, &tmp, 0); | 347 | lr->end = (int)strtoul(tmp + 1, &tmp, 0); |
349 | else | 348 | else |
350 | lr->end = 0; | 349 | lr->end = INT_MAX; |
351 | pr_debug("Line range is %u to %u\n", lr->start, lr->end); | 350 | pr_debug("Line range is %d to %d\n", lr->start, lr->end); |
352 | if (lr->end && lr->start > lr->end) { | 351 | if (lr->start > lr->end) { |
353 | semantic_error("Start line must be smaller" | 352 | semantic_error("Start line must be smaller" |
354 | " than end line.\n"); | 353 | " than end line.\n"); |
355 | return -EINVAL; | 354 | return -EINVAL; |
@@ -360,8 +359,10 @@ int parse_line_range_desc(const char *arg, struct line_range *lr) | |||
360 | return -EINVAL; | 359 | return -EINVAL; |
361 | } | 360 | } |
362 | tmp = strndup(arg, (ptr - arg)); | 361 | tmp = strndup(arg, (ptr - arg)); |
363 | } else | 362 | } else { |
364 | tmp = strdup(arg); | 363 | tmp = strdup(arg); |
364 | lr->end = INT_MAX; | ||
365 | } | ||
365 | 366 | ||
366 | if (tmp == NULL) | 367 | if (tmp == NULL) |
367 | return -ENOMEM; | 368 | return -ENOMEM; |