@@ -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
160164COMPAT_SYSCALL_DEFINE2 (ia32_stat64 , const char __user * , filename ,
0 commit comments