forked from Minki/linux
libfs: make simple_read_from_buffer conventional
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@linux-foundation.org: simplification suggested by hpa] [hpa@zytor.com: fix count==0 handling] Signed-off-by: Steven Rostedt <srostedt@redhat.com> Cc: Al Viro <viro@zeniv.linux.org.uk> Cc: Theodore Ts'o <tytso@mit.edu> Cc: Ingo Molnar <mingo@elte.hu> Signed-off-by: H. Peter Anvin <hpa@zytor.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
94a8d5caba
commit
14be27460e
@ -527,14 +527,18 @@ ssize_t simple_read_from_buffer(void __user *to, size_t count, loff_t *ppos,
|
|||||||
const void *from, size_t available)
|
const void *from, size_t available)
|
||||||
{
|
{
|
||||||
loff_t pos = *ppos;
|
loff_t pos = *ppos;
|
||||||
|
size_t ret;
|
||||||
|
|
||||||
if (pos < 0)
|
if (pos < 0)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
if (pos >= available)
|
if (pos >= available || !count)
|
||||||
return 0;
|
return 0;
|
||||||
if (count > available - pos)
|
if (count > available - pos)
|
||||||
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;
|
return -EFAULT;
|
||||||
|
count -= ret;
|
||||||
*ppos = pos + count;
|
*ppos = pos + count;
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user