diff options
| -rw-r--r-- | kernel/trace/trace_kprobe.c | 4 | ||||
| -rw-r--r-- | kernel/trace/trace_probe.c | 8 | ||||
| -rw-r--r-- | kernel/trace/trace_probe.h | 2 |
3 files changed, 6 insertions, 8 deletions
diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c index 1fad24acd444..ae4147eaebd4 100644 --- a/kernel/trace/trace_kprobe.c +++ b/kernel/trace/trace_kprobe.c | |||
| @@ -659,7 +659,7 @@ static int create_trace_kprobe(int argc, char **argv) | |||
| 659 | char *symbol = NULL, *event = NULL, *group = NULL; | 659 | char *symbol = NULL, *event = NULL, *group = NULL; |
| 660 | int maxactive = 0; | 660 | int maxactive = 0; |
| 661 | char *arg; | 661 | char *arg; |
| 662 | unsigned long offset = 0; | 662 | long offset = 0; |
| 663 | void *addr = NULL; | 663 | void *addr = NULL; |
| 664 | char buf[MAX_EVENT_NAME_LEN]; | 664 | char buf[MAX_EVENT_NAME_LEN]; |
| 665 | 665 | ||
| @@ -747,7 +747,7 @@ static int create_trace_kprobe(int argc, char **argv) | |||
| 747 | symbol = argv[1]; | 747 | symbol = argv[1]; |
| 748 | /* TODO: support .init module functions */ | 748 | /* TODO: support .init module functions */ |
| 749 | ret = traceprobe_split_symbol_offset(symbol, &offset); | 749 | ret = traceprobe_split_symbol_offset(symbol, &offset); |
| 750 | if (ret) { | 750 | if (ret || offset < 0 || offset > UINT_MAX) { |
| 751 | pr_info("Failed to parse either an address or a symbol.\n"); | 751 | pr_info("Failed to parse either an address or a symbol.\n"); |
| 752 | return ret; | 752 | return ret; |
| 753 | } | 753 | } |
diff --git a/kernel/trace/trace_probe.c b/kernel/trace/trace_probe.c index d59357308677..daf54bda4dc8 100644 --- a/kernel/trace/trace_probe.c +++ b/kernel/trace/trace_probe.c | |||
| @@ -320,7 +320,7 @@ static fetch_func_t get_fetch_size_function(const struct fetch_type *type, | |||
| 320 | } | 320 | } |
| 321 | 321 | ||
| 322 | /* Split symbol and offset. */ | 322 | /* Split symbol and offset. */ |
| 323 | int traceprobe_split_symbol_offset(char *symbol, unsigned long *offset) | 323 | int traceprobe_split_symbol_offset(char *symbol, long *offset) |
| 324 | { | 324 | { |
| 325 | char *tmp; | 325 | char *tmp; |
| 326 | int ret; | 326 | int ret; |
| @@ -328,13 +328,11 @@ int traceprobe_split_symbol_offset(char *symbol, unsigned long *offset) | |||
| 328 | if (!offset) | 328 | if (!offset) |
| 329 | return -EINVAL; | 329 | return -EINVAL; |
| 330 | 330 | ||
| 331 | tmp = strchr(symbol, '+'); | 331 | tmp = strpbrk(symbol, "+-"); |
| 332 | if (tmp) { | 332 | if (tmp) { |
| 333 | /* skip sign because kstrtoul doesn't accept '+' */ | 333 | ret = kstrtol(tmp, 0, offset); |
| 334 | ret = kstrtoul(tmp + 1, 0, offset); | ||
| 335 | if (ret) | 334 | if (ret) |
| 336 | return ret; | 335 | return ret; |
| 337 | |||
| 338 | *tmp = '\0'; | 336 | *tmp = '\0'; |
| 339 | } else | 337 | } else |
| 340 | *offset = 0; | 338 | *offset = 0; |
diff --git a/kernel/trace/trace_probe.h b/kernel/trace/trace_probe.h index e101c5bb9eda..6a4d3fa94042 100644 --- a/kernel/trace/trace_probe.h +++ b/kernel/trace/trace_probe.h | |||
| @@ -365,7 +365,7 @@ extern int traceprobe_conflict_field_name(const char *name, | |||
| 365 | extern void traceprobe_update_arg(struct probe_arg *arg); | 365 | extern void traceprobe_update_arg(struct probe_arg *arg); |
| 366 | extern void traceprobe_free_probe_arg(struct probe_arg *arg); | 366 | extern void traceprobe_free_probe_arg(struct probe_arg *arg); |
| 367 | 367 | ||
| 368 | extern int traceprobe_split_symbol_offset(char *symbol, unsigned long *offset); | 368 | extern int traceprobe_split_symbol_offset(char *symbol, long *offset); |
| 369 | 369 | ||
| 370 | /* Sum up total data length for dynamic arraies (strings) */ | 370 | /* Sum up total data length for dynamic arraies (strings) */ |
| 371 | static nokprobe_inline int | 371 | static nokprobe_inline int |
