compat breakage in preadv() and pwritev()
Al Viro
maintainerPATCH 1/1 compat breakage in preadv() and pwritev()
Fix for a dumb preadv()/pwritev() compat bug - unlike the native
variants, compat_... ones forget to check FMODE_P{READ,WRITE}, so e.g. on pipe the native preadv() will fail with -ESPIPE and compat one will act as readv() and succeed. Not critical, but it's a clear bug with trivial fix, so IMO it's OK for -final.
Signed-off-by Al Viro <[email protected]>
--- fs/compat.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
fs/compat.c +6 -2
@@ -1228,7 +1228,9 @@ compat_sys_preadv(unsigned long fd, const struct compat_iovec __user *vec, file =fget_light (fd, &fput_needed);if (!file)return -EBADF ; - ret =compat_readv (file, vec, vlen, &pos); + ret = -ESPIPE ; +if (file->f_mode &FMODE_PREAD ) + ret =compat_readv (file, vec, vlen, &pos);fput_light (file, fput_needed);return ret; }
@@ -1285,7 +1287,9 @@ compat_sys_pwritev(unsigned long fd, const struct compat_iovec __user *vec, file =fget_light (fd, &fput_needed);if (!file)return -EBADF ; - ret =compat_writev (file, vec, vlen, &pos); + ret = -ESPIPE ; +if (file->f_mode &FMODE_PWRITE ) + ret =compat_writev (file, vec, vlen, &pos);fput_light (file, fput_needed);return ret; }