Skip to content

Commit c120f3b

Browse files
author
Al Viro
committed
x86: switch cp_stat64() to unsafe_put_user()
Signed-off-by: Al Viro <[email protected]>
1 parent 8861fd5 commit c120f3b

File tree

1 file changed

+22
-18
lines changed

1 file changed

+22
-18
lines changed

arch/x86/kernel/sys_ia32.c

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -135,26 +135,30 @@ static int cp_stat64(struct stat64 __user *ubuf, struct kstat *stat)
135135
typeof(ubuf->st_gid) gid = 0;
136136
SET_UID(uid, from_kuid_munged(current_user_ns(), stat->uid));
137137
SET_GID(gid, from_kgid_munged(current_user_ns(), stat->gid));
138-
if (!access_ok(ubuf, sizeof(struct stat64)) ||
139-
__put_user(huge_encode_dev(stat->dev), &ubuf->st_dev) ||
140-
__put_user(stat->ino, &ubuf->__st_ino) ||
141-
__put_user(stat->ino, &ubuf->st_ino) ||
142-
__put_user(stat->mode, &ubuf->st_mode) ||
143-
__put_user(stat->nlink, &ubuf->st_nlink) ||
144-
__put_user(uid, &ubuf->st_uid) ||
145-
__put_user(gid, &ubuf->st_gid) ||
146-
__put_user(huge_encode_dev(stat->rdev), &ubuf->st_rdev) ||
147-
__put_user(stat->size, &ubuf->st_size) ||
148-
__put_user(stat->atime.tv_sec, &ubuf->st_atime) ||
149-
__put_user(stat->atime.tv_nsec, &ubuf->st_atime_nsec) ||
150-
__put_user(stat->mtime.tv_sec, &ubuf->st_mtime) ||
151-
__put_user(stat->mtime.tv_nsec, &ubuf->st_mtime_nsec) ||
152-
__put_user(stat->ctime.tv_sec, &ubuf->st_ctime) ||
153-
__put_user(stat->ctime.tv_nsec, &ubuf->st_ctime_nsec) ||
154-
__put_user(stat->blksize, &ubuf->st_blksize) ||
155-
__put_user(stat->blocks, &ubuf->st_blocks))
138+
if (!user_write_access_begin(ubuf, sizeof(struct stat64)))
156139
return -EFAULT;
140+
unsafe_put_user(huge_encode_dev(stat->dev), &ubuf->st_dev, Efault);
141+
unsafe_put_user(stat->ino, &ubuf->__st_ino, Efault);
142+
unsafe_put_user(stat->ino, &ubuf->st_ino, Efault);
143+
unsafe_put_user(stat->mode, &ubuf->st_mode, Efault);
144+
unsafe_put_user(stat->nlink, &ubuf->st_nlink, Efault);
145+
unsafe_put_user(uid, &ubuf->st_uid, Efault);
146+
unsafe_put_user(gid, &ubuf->st_gid, Efault);
147+
unsafe_put_user(huge_encode_dev(stat->rdev), &ubuf->st_rdev, Efault);
148+
unsafe_put_user(stat->size, &ubuf->st_size, Efault);
149+
unsafe_put_user(stat->atime.tv_sec, &ubuf->st_atime, Efault);
150+
unsafe_put_user(stat->atime.tv_nsec, &ubuf->st_atime_nsec, Efault);
151+
unsafe_put_user(stat->mtime.tv_sec, &ubuf->st_mtime, Efault);
152+
unsafe_put_user(stat->mtime.tv_nsec, &ubuf->st_mtime_nsec, Efault);
153+
unsafe_put_user(stat->ctime.tv_sec, &ubuf->st_ctime, Efault);
154+
unsafe_put_user(stat->ctime.tv_nsec, &ubuf->st_ctime_nsec, Efault);
155+
unsafe_put_user(stat->blksize, &ubuf->st_blksize, Efault);
156+
unsafe_put_user(stat->blocks, &ubuf->st_blocks, Efault);
157+
user_access_end();
157158
return 0;
159+
Efault:
160+
user_write_access_end();
161+
return -EFAULT;
158162
}
159163

160164
COMPAT_SYSCALL_DEFINE2(ia32_stat64, const char __user *, filename,

0 commit comments

Comments
 (0)