diff options
Diffstat (limited to 'kernel/trace/trace_kprobe.c')
| -rw-r--r-- | kernel/trace/trace_kprobe.c | 22 |
1 files changed, 10 insertions, 12 deletions
diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c index 5c19b8c41c7e..9eaf07f99212 100644 --- a/kernel/trace/trace_kprobe.c +++ b/kernel/trace/trace_kprobe.c | |||
| @@ -607,11 +607,17 @@ static int trace_kprobe_create(int argc, const char *argv[]) | |||
| 607 | char buf[MAX_EVENT_NAME_LEN]; | 607 | char buf[MAX_EVENT_NAME_LEN]; |
| 608 | unsigned int flags = TPARG_FL_KERNEL; | 608 | unsigned int flags = TPARG_FL_KERNEL; |
| 609 | 609 | ||
| 610 | /* argc must be >= 1 */ | 610 | switch (argv[0][0]) { |
| 611 | if (argv[0][0] == 'r') { | 611 | case 'r': |
| 612 | is_return = true; | 612 | is_return = true; |
| 613 | flags |= TPARG_FL_RETURN; | 613 | flags |= TPARG_FL_RETURN; |
| 614 | } else if (argv[0][0] != 'p' || argc < 2) | 614 | break; |
| 615 | case 'p': | ||
| 616 | break; | ||
| 617 | default: | ||
| 618 | return -ECANCELED; | ||
| 619 | } | ||
| 620 | if (argc < 2) | ||
| 615 | return -ECANCELED; | 621 | return -ECANCELED; |
| 616 | 622 | ||
| 617 | event = strchr(&argv[0][1], ':'); | 623 | event = strchr(&argv[0][1], ':'); |
| @@ -855,22 +861,14 @@ static const struct file_operations kprobe_profile_ops = { | |||
| 855 | static nokprobe_inline int | 861 | static nokprobe_inline int |
| 856 | fetch_store_strlen(unsigned long addr) | 862 | fetch_store_strlen(unsigned long addr) |
| 857 | { | 863 | { |
| 858 | mm_segment_t old_fs; | ||
| 859 | int ret, len = 0; | 864 | int ret, len = 0; |
| 860 | u8 c; | 865 | u8 c; |
| 861 | 866 | ||
| 862 | old_fs = get_fs(); | ||
| 863 | set_fs(KERNEL_DS); | ||
| 864 | pagefault_disable(); | ||
| 865 | |||
| 866 | do { | 867 | do { |
| 867 | ret = __copy_from_user_inatomic(&c, (u8 *)addr + len, 1); | 868 | ret = probe_mem_read(&c, (u8 *)addr + len, 1); |
| 868 | len++; | 869 | len++; |
| 869 | } while (c && ret == 0 && len < MAX_STRING_SIZE); | 870 | } while (c && ret == 0 && len < MAX_STRING_SIZE); |
| 870 | 871 | ||
| 871 | pagefault_enable(); | ||
| 872 | set_fs(old_fs); | ||
| 873 | |||
| 874 | return (ret < 0) ? ret : len; | 872 | return (ret < 0) ? ret : len; |
| 875 | } | 873 | } |
| 876 | 874 | ||
