vfs: missed source of ->f_pos races

compat_sys_{read,write}v() need the same "pass a copy of file->f_pos" thing
as sys_{read,write}{,v}().

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Cc: stable@kernel.org
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Al Viro 2012-08-20 15:28:00 +01:00 committed by Linus Torvalds
parent 90785be317
commit 0e665d5d11

View File

@ -1155,11 +1155,14 @@ compat_sys_readv(unsigned long fd, const struct compat_iovec __user *vec,
struct file *file; struct file *file;
int fput_needed; int fput_needed;
ssize_t ret; ssize_t ret;
loff_t pos;
file = fget_light(fd, &fput_needed); file = fget_light(fd, &fput_needed);
if (!file) if (!file)
return -EBADF; return -EBADF;
ret = compat_readv(file, vec, vlen, &file->f_pos); pos = file->f_pos;
ret = compat_readv(file, vec, vlen, &pos);
file->f_pos = pos;
fput_light(file, fput_needed); fput_light(file, fput_needed);
return ret; return ret;
} }
@ -1221,11 +1224,14 @@ compat_sys_writev(unsigned long fd, const struct compat_iovec __user *vec,
struct file *file; struct file *file;
int fput_needed; int fput_needed;
ssize_t ret; ssize_t ret;
loff_t pos;
file = fget_light(fd, &fput_needed); file = fget_light(fd, &fput_needed);
if (!file) if (!file)
return -EBADF; return -EBADF;
ret = compat_writev(file, vec, vlen, &file->f_pos); pos = file->f_pos;
ret = compat_writev(file, vec, vlen, &pos);
file->f_pos = pos;
fput_light(file, fput_needed); fput_light(file, fput_needed);
return ret; return ret;
} }