Commit c44ed965be7a84afaa07543c04eb97a5dfe93422
Committed by
Linus Torvalds
1 parent
c9a816c0ec
Exists in
master
and in
7 other branches
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
fs/compat.c
| ... | ... | @@ -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 | } |