Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3c91930f authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'trace-fixes-v3.9-rc-v3' of...

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
parents 935d8aab 7f49ef69
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -396,7 +396,6 @@ ssize_t ftrace_filter_write(struct file *file, const char __user *ubuf,
			    size_t cnt, loff_t *ppos);
			    size_t cnt, loff_t *ppos);
ssize_t ftrace_notrace_write(struct file *file, const char __user *ubuf,
ssize_t ftrace_notrace_write(struct file *file, const char __user *ubuf,
			     size_t cnt, loff_t *ppos);
			     size_t cnt, loff_t *ppos);
loff_t ftrace_regex_lseek(struct file *file, loff_t offset, int whence);
int ftrace_regex_release(struct inode *inode, struct file *file);
int ftrace_regex_release(struct inode *inode, struct file *file);


void __init
void __init
@@ -569,6 +568,8 @@ static inline int
ftrace_regex_release(struct inode *inode, struct file *file) { return -ENODEV; }
ftrace_regex_release(struct inode *inode, struct file *file) { return -ENODEV; }
#endif /* CONFIG_DYNAMIC_FTRACE */
#endif /* CONFIG_DYNAMIC_FTRACE */


loff_t ftrace_filter_lseek(struct file *file, loff_t offset, int whence);

/* totally disable ftrace - can not re-enable after this */
/* totally disable ftrace - can not re-enable after this */
void ftrace_kill(void);
void ftrace_kill(void);


+18 −18
Original line number Original line Diff line number Diff line
@@ -1052,6 +1052,19 @@ static __init void ftrace_profile_debugfs(struct dentry *d_tracer)


static struct pid * const ftrace_swapper_pid = &init_struct_pid;
static struct pid * const ftrace_swapper_pid = &init_struct_pid;


loff_t
ftrace_filter_lseek(struct file *file, loff_t offset, int whence)
{
	loff_t ret;

	if (file->f_mode & FMODE_READ)
		ret = seq_lseek(file, offset, whence);
	else
		file->f_pos = ret = 1;

	return ret;
}

#ifdef CONFIG_DYNAMIC_FTRACE
#ifdef CONFIG_DYNAMIC_FTRACE


#ifndef CONFIG_FTRACE_MCOUNT_RECORD
#ifndef CONFIG_FTRACE_MCOUNT_RECORD
@@ -2612,7 +2625,7 @@ static void ftrace_filter_reset(struct ftrace_hash *hash)
 * routine, you can use ftrace_filter_write() for the write
 * routine, you can use ftrace_filter_write() for the write
 * routine if @flag has FTRACE_ITER_FILTER set, or
 * routine if @flag has FTRACE_ITER_FILTER set, or
 * ftrace_notrace_write() if @flag has FTRACE_ITER_NOTRACE set.
 * ftrace_notrace_write() if @flag has FTRACE_ITER_NOTRACE set.
 * ftrace_regex_lseek() should be used as the lseek routine, and
 * ftrace_filter_lseek() should be used as the lseek routine, and
 * release must call ftrace_regex_release().
 * release must call ftrace_regex_release().
 */
 */
int
int
@@ -2696,19 +2709,6 @@ ftrace_notrace_open(struct inode *inode, struct file *file)
				 inode, file);
				 inode, file);
}
}


loff_t
ftrace_regex_lseek(struct file *file, loff_t offset, int whence)
{
	loff_t ret;

	if (file->f_mode & FMODE_READ)
		ret = seq_lseek(file, offset, whence);
	else
		file->f_pos = ret = 1;

	return ret;
}

static int ftrace_match(char *str, char *regex, int len, int type)
static int ftrace_match(char *str, char *regex, int len, int type)
{
{
	int matched = 0;
	int matched = 0;
@@ -3570,7 +3570,7 @@ static const struct file_operations ftrace_filter_fops = {
	.open = ftrace_filter_open,
	.open = ftrace_filter_open,
	.read = seq_read,
	.read = seq_read,
	.write = ftrace_filter_write,
	.write = ftrace_filter_write,
	.llseek = ftrace_regex_lseek,
	.llseek = ftrace_filter_lseek,
	.release = ftrace_regex_release,
	.release = ftrace_regex_release,
};
};


@@ -3578,7 +3578,7 @@ static const struct file_operations ftrace_notrace_fops = {
	.open = ftrace_notrace_open,
	.open = ftrace_notrace_open,
	.read = seq_read,
	.read = seq_read,
	.write = ftrace_notrace_write,
	.write = ftrace_notrace_write,
	.llseek = ftrace_regex_lseek,
	.llseek = ftrace_filter_lseek,
	.release = ftrace_regex_release,
	.release = ftrace_regex_release,
};
};


@@ -3783,8 +3783,8 @@ static const struct file_operations ftrace_graph_fops = {
	.open		= ftrace_graph_open,
	.open		= ftrace_graph_open,
	.read		= seq_read,
	.read		= seq_read,
	.write		= ftrace_graph_write,
	.write		= ftrace_graph_write,
	.llseek		= ftrace_filter_lseek,
	.release	= ftrace_graph_release,
	.release	= ftrace_graph_release,
	.llseek		= seq_lseek,
};
};
#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
#endif /* CONFIG_FUNCTION_GRAPH_TRACER */


@@ -4439,7 +4439,7 @@ static const struct file_operations ftrace_pid_fops = {
	.open		= ftrace_pid_open,
	.open		= ftrace_pid_open,
	.write		= ftrace_pid_write,
	.write		= ftrace_pid_write,
	.read		= seq_read,
	.read		= seq_read,
	.llseek		= seq_lseek,
	.llseek		= ftrace_filter_lseek,
	.release	= ftrace_pid_release,
	.release	= ftrace_pid_release,
};
};


+1 −1
Original line number Original line Diff line number Diff line
@@ -322,7 +322,7 @@ static const struct file_operations stack_trace_filter_fops = {
	.open = stack_trace_filter_open,
	.open = stack_trace_filter_open,
	.read = seq_read,
	.read = seq_read,
	.write = ftrace_filter_write,
	.write = ftrace_filter_write,
	.llseek = ftrace_regex_lseek,
	.llseek = ftrace_filter_lseek,
	.release = ftrace_regex_release,
	.release = ftrace_regex_release,
};
};