Skip to content

Commit 57dba9b

Browse files
Al Virogregkh
authored andcommitted
vfs: missed source of ->f_pos races
commit 0e665d5 upstream. 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 <[email protected]> Signed-off-by: Linus Torvalds <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 0253e78 commit 57dba9b

File tree

1 file changed

+8
-2
lines changed

1 file changed

+8
-2
lines changed

fs/compat.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1177,11 +1177,14 @@ compat_sys_readv(unsigned long fd, const struct compat_iovec __user *vec,
11771177
struct file *file;
11781178
int fput_needed;
11791179
ssize_t ret;
1180+
loff_t pos;
11801181

11811182
file = fget_light(fd, &fput_needed);
11821183
if (!file)
11831184
return -EBADF;
1184-
ret = compat_readv(file, vec, vlen, &file->f_pos);
1185+
pos = file->f_pos;
1186+
ret = compat_readv(file, vec, vlen, &pos);
1187+
file->f_pos = pos;
11851188
fput_light(file, fput_needed);
11861189
return ret;
11871190
}
@@ -1236,11 +1239,14 @@ compat_sys_writev(unsigned long fd, const struct compat_iovec __user *vec,
12361239
struct file *file;
12371240
int fput_needed;
12381241
ssize_t ret;
1242+
loff_t pos;
12391243

12401244
file = fget_light(fd, &fput_needed);
12411245
if (!file)
12421246
return -EBADF;
1243-
ret = compat_writev(file, vec, vlen, &file->f_pos);
1247+
pos = file->f_pos;
1248+
ret = compat_writev(file, vec, vlen, &pos);
1249+
file->f_pos = pos;
12441250
fput_light(file, fput_needed);
12451251
return ret;
12461252
}

0 commit comments

Comments
 (0)