@@ -135,26 +135,30 @@ static int cp_stat64(struct stat64 __user *ubuf, struct kstat *stat)
135
135
typeof (ubuf -> st_gid ) gid = 0 ;
136
136
SET_UID (uid , from_kuid_munged (current_user_ns (), stat -> uid ));
137
137
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 )))
156
139
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 ();
157
158
return 0 ;
159
+ Efault :
160
+ user_write_access_end ();
161
+ return - EFAULT ;
158
162
}
159
163
160
164
COMPAT_SYSCALL_DEFINE2 (ia32_stat64 , const char __user * , filename ,
0 commit comments