Commit c44ed965be7a84afaa07543c04eb97a5dfe93422

Authored by Al Viro
Committed by Linus Torvalds
1 parent c9a816c0ec

compat breakage in preadv() and pwritev()

Fix for a dumb preadv()/pwritev() compat bug - unlike the native
variants, the 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 <viro@zeniv.linux.org.uk>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

Showing 1 changed file with 6 additions and 2 deletions Side-by-side Diff

... ... @@ -1228,7 +1228,9 @@
1228 1228 file = fget_light(fd, &fput_needed);
1229 1229 if (!file)
1230 1230 return -EBADF;
1231   - ret = compat_readv(file, vec, vlen, &pos);
  1231 + ret = -ESPIPE;
  1232 + if (file->f_mode & FMODE_PREAD)
  1233 + ret = compat_readv(file, vec, vlen, &pos);
1232 1234 fput_light(file, fput_needed);
1233 1235 return ret;
1234 1236 }
... ... @@ -1285,7 +1287,9 @@
1285 1287 file = fget_light(fd, &fput_needed);
1286 1288 if (!file)
1287 1289 return -EBADF;
1288   - ret = compat_writev(file, vec, vlen, &pos);
  1290 + ret = -ESPIPE;
  1291 + if (file->f_mode & FMODE_PWRITE)
  1292 + ret = compat_writev(file, vec, vlen, &pos);
1289 1293 fput_light(file, fput_needed);
1290 1294 return ret;
1291 1295 }