diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-04-14 13:50:55 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-04-14 13:50:55 -0400 |
commit | 3c91930f0cbd54d522d8844b221c36199a2dc11e (patch) | |
tree | b505e2c70afd0dcf8704bfdd91e3d5011f7ccc46 | |
parent | 935d8aabd4331f47a89c3e1daa5779d23cf244ee (diff) | |
parent | 7f49ef69db6bbf756c0abca7e9b65b32e999eec8 (diff) |
Merge tag 'trace-fixes-v3.9-rc-v3' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace
Pull ftrace fixes from Steven Rostedt:
"Namhyung Kim found and fixed a bug that can crash the kernel by simply
doing: echo 1234 | tee -a /sys/kernel/debug/tracing/set_ftrace_pid
Luckily, this can only be done by root, but still is a nasty bug."
* tag 'trace-fixes-v3.9-rc-v3' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace:
ftrace: Move ftrace_filter_lseek out of CONFIG_DYNAMIC_FTRACE section
tracing: Fix possible NULL pointer dereferences
-rw-r--r-- | include/linux/ftrace.h | 3 | ||||
-rw-r--r-- | kernel/trace/ftrace.c | 36 | ||||
-rw-r--r-- | kernel/trace/trace_stack.c | 2 |
3 files changed, 21 insertions, 20 deletions
diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h index 167abf907802..52da2a250795 100644 --- a/include/linux/ftrace.h +++ b/include/linux/ftrace.h | |||
@@ -396,7 +396,6 @@ ssize_t ftrace_filter_write(struct file *file, const char __user *ubuf, | |||
396 | size_t cnt, loff_t *ppos); | 396 | size_t cnt, loff_t *ppos); |
397 | ssize_t ftrace_notrace_write(struct file *file, const char __user *ubuf, | 397 | ssize_t ftrace_notrace_write(struct file *file, const char __user *ubuf, |
398 | size_t cnt, loff_t *ppos); | 398 | size_t cnt, loff_t *ppos); |
399 | loff_t ftrace_regex_lseek(struct file *file, loff_t offset, int whence); | ||
400 | int ftrace_regex_release(struct inode *inode, struct file *file); | 399 | int ftrace_regex_release(struct inode *inode, struct file *file); |
401 | 400 | ||
402 | void __init | 401 | void __init |
@@ -569,6 +568,8 @@ static inline int | |||
569 | ftrace_regex_release(struct inode *inode, struct file *file) { return -ENODEV; } | 568 | ftrace_regex_release(struct inode *inode, struct file *file) { return -ENODEV; } |
570 | #endif /* CONFIG_DYNAMIC_FTRACE */ | 569 | #endif /* CONFIG_DYNAMIC_FTRACE */ |
571 | 570 | ||
571 | loff_t ftrace_filter_lseek(struct file *file, loff_t offset, int whence); | ||
572 | |||
572 | /* totally disable ftrace - can not re-enable after this */ | 573 | /* totally disable ftrace - can not re-enable after this */ |
573 | void ftrace_kill(void); | 574 | void ftrace_kill(void); |
574 | 575 | ||
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 926ebfb74936..2461ede45a8d 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c | |||
@@ -1052,6 +1052,19 @@ static __init void ftrace_profile_debugfs(struct dentry *d_tracer) | |||
1052 | 1052 | ||
1053 | static struct pid * const ftrace_swapper_pid = &init_struct_pid; | 1053 | static struct pid * const ftrace_swapper_pid = &init_struct_pid; |
1054 | 1054 | ||
1055 | loff_t | ||
1056 | ftrace_filter_lseek(struct file *file, loff_t offset, int whence) | ||
1057 | { | ||
1058 | loff_t ret; | ||
1059 | |||
1060 | if (file->f_mode & FMODE_READ) | ||
1061 | ret = seq_lseek(file, offset, whence); | ||
1062 | else | ||
1063 | file->f_pos = ret = 1; | ||
1064 | |||
1065 | return ret; | ||
1066 | } | ||
1067 | |||
1055 | #ifdef CONFIG_DYNAMIC_FTRACE | 1068 | #ifdef CONFIG_DYNAMIC_FTRACE |
1056 | 1069 | ||
1057 | #ifndef CONFIG_FTRACE_MCOUNT_RECORD | 1070 | #ifndef CONFIG_FTRACE_MCOUNT_RECORD |
@@ -2612,7 +2625,7 @@ static void ftrace_filter_reset(struct ftrace_hash *hash) | |||
2612 | * routine, you can use ftrace_filter_write() for the write | 2625 | * routine, you can use ftrace_filter_write() for the write |
2613 | * routine if @flag has FTRACE_ITER_FILTER set, or | 2626 | * routine if @flag has FTRACE_ITER_FILTER set, or |
2614 | * ftrace_notrace_write() if @flag has FTRACE_ITER_NOTRACE set. | 2627 | * ftrace_notrace_write() if @flag has FTRACE_ITER_NOTRACE set. |
2615 | * ftrace_regex_lseek() should be used as the lseek routine, and | 2628 | * ftrace_filter_lseek() should be used as the lseek routine, and |
2616 | * release must call ftrace_regex_release(). | 2629 | * release must call ftrace_regex_release(). |
2617 | */ | 2630 | */ |
2618 | int | 2631 | int |
@@ -2696,19 +2709,6 @@ ftrace_notrace_open(struct inode *inode, struct file *file) | |||
2696 | inode, file); | 2709 | inode, file); |
2697 | } | 2710 | } |
2698 | 2711 | ||
2699 | loff_t | ||
2700 | ftrace_regex_lseek(struct file *file, loff_t offset, int whence) | ||
2701 | { | ||
2702 | loff_t ret; | ||
2703 | |||
2704 | if (file->f_mode & FMODE_READ) | ||
2705 | ret = seq_lseek(file, offset, whence); | ||
2706 | else | ||
2707 | file->f_pos = ret = 1; | ||
2708 | |||
2709 | return ret; | ||
2710 | } | ||
2711 | |||
2712 | static int ftrace_match(char *str, char *regex, int len, int type) | 2712 | static int ftrace_match(char *str, char *regex, int len, int type) |
2713 | { | 2713 | { |
2714 | int matched = 0; | 2714 | int matched = 0; |
@@ -3570,7 +3570,7 @@ static const struct file_operations ftrace_filter_fops = { | |||
3570 | .open = ftrace_filter_open, | 3570 | .open = ftrace_filter_open, |
3571 | .read = seq_read, | 3571 | .read = seq_read, |
3572 | .write = ftrace_filter_write, | 3572 | .write = ftrace_filter_write, |
3573 | .llseek = ftrace_regex_lseek, | 3573 | .llseek = ftrace_filter_lseek, |
3574 | .release = ftrace_regex_release, | 3574 | .release = ftrace_regex_release, |
3575 | }; | 3575 | }; |
3576 | 3576 | ||
@@ -3578,7 +3578,7 @@ static const struct file_operations ftrace_notrace_fops = { | |||
3578 | .open = ftrace_notrace_open, | 3578 | .open = ftrace_notrace_open, |
3579 | .read = seq_read, | 3579 | .read = seq_read, |
3580 | .write = ftrace_notrace_write, | 3580 | .write = ftrace_notrace_write, |
3581 | .llseek = ftrace_regex_lseek, | 3581 | .llseek = ftrace_filter_lseek, |
3582 | .release = ftrace_regex_release, | 3582 | .release = ftrace_regex_release, |
3583 | }; | 3583 | }; |
3584 | 3584 | ||
@@ -3783,8 +3783,8 @@ static const struct file_operations ftrace_graph_fops = { | |||
3783 | .open = ftrace_graph_open, | 3783 | .open = ftrace_graph_open, |
3784 | .read = seq_read, | 3784 | .read = seq_read, |
3785 | .write = ftrace_graph_write, | 3785 | .write = ftrace_graph_write, |
3786 | .llseek = ftrace_filter_lseek, | ||
3786 | .release = ftrace_graph_release, | 3787 | .release = ftrace_graph_release, |
3787 | .llseek = seq_lseek, | ||
3788 | }; | 3788 | }; |
3789 | #endif /* CONFIG_FUNCTION_GRAPH_TRACER */ | 3789 | #endif /* CONFIG_FUNCTION_GRAPH_TRACER */ |
3790 | 3790 | ||
@@ -4439,7 +4439,7 @@ static const struct file_operations ftrace_pid_fops = { | |||
4439 | .open = ftrace_pid_open, | 4439 | .open = ftrace_pid_open, |
4440 | .write = ftrace_pid_write, | 4440 | .write = ftrace_pid_write, |
4441 | .read = seq_read, | 4441 | .read = seq_read, |
4442 | .llseek = seq_lseek, | 4442 | .llseek = ftrace_filter_lseek, |
4443 | .release = ftrace_pid_release, | 4443 | .release = ftrace_pid_release, |
4444 | }; | 4444 | }; |
4445 | 4445 | ||
diff --git a/kernel/trace/trace_stack.c b/kernel/trace/trace_stack.c index 42ca822fc701..83a8b5b7bd35 100644 --- a/kernel/trace/trace_stack.c +++ b/kernel/trace/trace_stack.c | |||
@@ -322,7 +322,7 @@ static const struct file_operations stack_trace_filter_fops = { | |||
322 | .open = stack_trace_filter_open, | 322 | .open = stack_trace_filter_open, |
323 | .read = seq_read, | 323 | .read = seq_read, |
324 | .write = ftrace_filter_write, | 324 | .write = ftrace_filter_write, |
325 | .llseek = ftrace_regex_lseek, | 325 | .llseek = ftrace_filter_lseek, |
326 | .release = ftrace_regex_release, | 326 | .release = ftrace_regex_release, |
327 | }; | 327 | }; |
328 | 328 | ||