From: Steven Rostedt <rostedt@xxxxxxxxxxx> Impact: have simple_read_from_buffer conform to standards It was brought to my attention by Andrew Morton, Theodore Tso, and H. Peter Anvin that a read from userspace should only return -EFAULT if nothing was actually read. Looking at the simple_read_from_buffer I noticed that this function does not conform to that rule. This patch fixes that function. [akpm@xxxxxxxxxxxxxxxxxxxx: simplification suggested by hpa] [hpa@xxxxxxxxx: fix count==0 handling] Signed-off-by: Steven Rostedt <srostedt@xxxxxxxxxx> Cc: Al Viro <viro@xxxxxxxxxxxxxxxxxx> Cc: Theodore Ts'o <tytso@xxxxxxx> Cc: Ingo Molnar <mingo@xxxxxxx> Signed-off-by: H. Peter Anvin <hpa@xxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- fs/libfs.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff -puN fs/libfs.c~libfs-make-simple_read_from_buffer-conventional fs/libfs.c --- a/fs/libfs.c~libfs-make-simple_read_from_buffer-conventional +++ a/fs/libfs.c @@ -527,14 +527,18 @@ ssize_t simple_read_from_buffer(void __u const void *from, size_t available) { loff_t pos = *ppos; + size_t ret; + if (pos < 0) return -EINVAL; - if (pos >= available) + if (pos >= available || !count) return 0; if (count > available - pos) count = available - pos; - if (copy_to_user(to, from + pos, count)) + ret = copy_to_user(to, from + pos, count); + if (ret == count) return -EFAULT; + count -= ret; *ppos = pos + count; return count; } _ -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html