From: Steven Rostedt Impact: clean up This removes the open coded parsing of a word sent in by the user and replaces it with copy_strtok_from_user. Also removes cnt < 0 check since cnt is unsigned. Also uses (*ppos) += cnt, instead of file->pos += cnt. Signed-off-by: Steven Rostedt --- kernel/trace/ftrace.c | 52 +++++++++++++++++------------------------------- 1 files changed, 19 insertions(+), 33 deletions(-) diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 4ecce15..6204b3c 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c @@ -2079,10 +2079,9 @@ ftrace_graph_write(struct file *file, const char __user *ubuf, unsigned long *array; size_t read = 0; ssize_t ret; - int index = 0; - char ch; + int copied; - if (!cnt || cnt < 0) + if (!cnt) return 0; mutex_lock(&graph_lock); @@ -2098,48 +2097,35 @@ ftrace_graph_write(struct file *file, const char __user *ubuf, } else array = file->private_data; - ret = get_user(ch, ubuf++); - if (ret) - goto out; - read++; - cnt--; + ret = copy_strtok_from_user(buffer, ubuf, FTRACE_BUFF_MAX, + cnt, &copied, 1, SPACES); - /* skip white space */ - while (cnt && isspace(ch)) { - ret = get_user(ch, ubuf++); - if (ret) + if (ret == -EAGAIN) { + if (copied) { + /* This do not deal with split words */ + ret = -EINVAL; goto out; - read++; - cnt--; - } + } - if (isspace(ch)) { - *ppos += read; - ret = read; + /* Just white space */ + (*ppos) += cnt; + ret = cnt; goto out; } - while (cnt && !isspace(ch)) { - if (index < FTRACE_BUFF_MAX) - buffer[index++] = ch; - else { - ret = -EINVAL; - goto out; - } - ret = get_user(ch, ubuf++); - if (ret) - goto out; - read++; - cnt--; - } - buffer[index] = 0; + if (ret < 0) + goto out; + + read = ret; + + buffer[copied] = 0; /* we allow only one expression at a time */ ret = ftrace_set_func(array, &ftrace_graph_count, buffer); if (ret) goto out; - file->f_pos += read; + (*ppos) += read; ret = read; out: -- 1.5.6.5 -- -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/