The current code will truncate the ftrace files contents if O_APPEND is not set and the file is opened in write mode. This is incorrect. It should only truncate the file if O_TRUNC is set. Otherwise if one of these files is opened by a C program with fopen "r+", it will incorrectly truncate the file.
Showing the changes to kernel/trace (3 of 3 files). Show all
Unified · Split
| @@ -1662,7 +1662,7 @@ ftrace_regex_open(struct inode *inode, struct file *file, int enable) · 1661 unmodified lines | |||
| 1662 | 1662 | ||
| 1663 | mutex_lock(&ftrace_regex_lock); | 1663 | mutex_lock(&ftrace_regex_lock); |
| 1664 | if ((file->f_mode & FMODE_WRITE) && | 1664 | if ((file->f_mode & FMODE_WRITE) && |
| 1665 | !(file->f_flags & O_APPEND)) | 1665 | (file->f_flags & O_TRUNC)) |
| 1666 | ftrace_filter_reset(enable); | 1666 | ftrace_filter_reset(enable); |
| 1667 | 1667 | ||
| 1668 | if (file->f_mode & FMODE_READ) { | 1668 | if (file->f_mode & FMODE_READ) { |
| @@ -2577,7 +2577,7 @@ ftrace_graph_open(struct inode *inode, struct file *file) · 908 unmodified lines | |||
| 2577 | 2577 | ||
| 2578 | mutex_lock(&graph_lock); | 2578 | mutex_lock(&graph_lock); |
| 2579 | if ((file->f_mode & FMODE_WRITE) && | 2579 | if ((file->f_mode & FMODE_WRITE) && |
| 2580 | !(file->f_flags & O_APPEND)) { | 2580 | (file->f_flags & O_TRUNC)) { |
| 2581 | ftrace_graph_count = 0; | 2581 | ftrace_graph_count = 0; |
| 2582 | memset(ftrace_graph_funcs, 0, sizeof(ftrace_graph_funcs)); | 2582 | memset(ftrace_graph_funcs, 0, sizeof(ftrace_graph_funcs)); |
| 2583 | } | 2583 | } |
| @@ -2031,7 +2031,7 @@ static int tracing_open(struct inode *inode, struct file *file) · 2030 unmodified lines | |||
| 2031 | 2031 | ||
| 2032 | /* If this file was open for write, then erase contents */ | 2032 | /* If this file was open for write, then erase contents */ |
| 2033 | if ((file->f_mode & FMODE_WRITE) && | 2033 | if ((file->f_mode & FMODE_WRITE) && |
| 2034 | !(file->f_flags & O_APPEND)) { | 2034 | (file->f_flags & O_TRUNC)) { |
| 2035 | long cpu = (long) inode->i_private; | 2035 | long cpu = (long) inode->i_private; |
| 2036 | 2036 | ||
| 2037 | if (cpu == TRACE_PIPE_ALL_CPU) | 2037 | if (cpu == TRACE_PIPE_ALL_CPU) |
| @@ -376,7 +376,7 @@ ftrace_event_seq_open(struct inode *inode, struct file *file) · 375 unmodified lines | |||
| 376 | const struct seq_operations *seq_ops; | 376 | const struct seq_operations *seq_ops; |
| 377 | 377 | ||
| 378 | if ((file->f_mode & FMODE_WRITE) && | 378 | if ((file->f_mode & FMODE_WRITE) && |
| 379 | !(file->f_flags & O_APPEND)) | 379 | (file->f_flags & O_TRUNC)) |
| 380 | ftrace_clear_events(); | 380 | ftrace_clear_events(); |
| 381 | 381 | ||
| 382 | seq_ops = inode->i_private; | 382 | seq_ops = inode->i_private; |