@@ -200,16 +200,13 @@ static bool fillonedir(struct dir_context *ctx, const char *name, int namlen,
200200 }
201201 buf -> result ++ ;
202202 dirent = buf -> dirent ;
203- if (!user_write_access_begin (dirent , dirent_size (dirent , namlen + 1 )))
204- goto efault ;
205- unsafe_put_user (d_ino , & dirent -> d_ino , efault_end );
206- unsafe_put_user (offset , & dirent -> d_offset , efault_end );
207- unsafe_put_user (namlen , & dirent -> d_namlen , efault_end );
208- unsafe_copy_dirent_name (dirent -> d_name , name , namlen , efault_end );
209- user_write_access_end ();
203+ scoped_user_write_access_size (dirent , dirent_size (dirent , namlen + 1 ), efault ) {
204+ unsafe_put_user (d_ino , & dirent -> d_ino , efault );
205+ unsafe_put_user (offset , & dirent -> d_offset , efault );
206+ unsafe_put_user (namlen , & dirent -> d_namlen , efault );
207+ unsafe_copy_dirent_name (dirent -> d_name , name , namlen , efault );
208+ }
210209 return true;
211- efault_end :
212- user_write_access_end ();
213210efault :
214211 buf -> result = - EFAULT ;
215212 return false;
@@ -286,23 +283,19 @@ static bool filldir(struct dir_context *ctx, const char *name, int namlen,
286283 return false;
287284 dirent = buf -> current_dir ;
288285 prev = (void __user * ) dirent - prev_reclen ;
289- if (!user_write_access_begin (prev , reclen + prev_reclen ))
290- goto efault ;
291-
292- /* This might be 'dirent->d_off', but if so it will get overwritten */
293- unsafe_put_user (offset , & prev -> d_off , efault_end );
294- unsafe_put_user (d_ino , & dirent -> d_ino , efault_end );
295- unsafe_put_user (reclen , & dirent -> d_reclen , efault_end );
296- unsafe_put_user (d_type , (char __user * ) dirent + reclen - 1 , efault_end );
297- unsafe_copy_dirent_name (dirent -> d_name , name , namlen , efault_end );
298- user_write_access_end ();
286+ scoped_user_write_access_size (prev , reclen + prev_reclen , efault ) {
287+ /* This might be 'dirent->d_off', but if so it will get overwritten */
288+ unsafe_put_user (offset , & prev -> d_off , efault );
289+ unsafe_put_user (d_ino , & dirent -> d_ino , efault );
290+ unsafe_put_user (reclen , & dirent -> d_reclen , efault );
291+ unsafe_put_user (d_type , (char __user * )dirent + reclen - 1 , efault );
292+ unsafe_copy_dirent_name (dirent -> d_name , name , namlen , efault );
293+ }
299294
300295 buf -> current_dir = (void __user * )dirent + reclen ;
301296 buf -> prev_reclen = reclen ;
302297 ctx -> count -= reclen ;
303298 return true;
304- efault_end :
305- user_write_access_end ();
306299efault :
307300 buf -> error = - EFAULT ;
308301 return false;
@@ -369,24 +362,20 @@ static bool filldir64(struct dir_context *ctx, const char *name, int namlen,
369362 return false;
370363 dirent = buf -> current_dir ;
371364 prev = (void __user * )dirent - prev_reclen ;
372- if (!user_write_access_begin (prev , reclen + prev_reclen ))
373- goto efault ;
374-
375- /* This might be 'dirent->d_off', but if so it will get overwritten */
376- unsafe_put_user (offset , & prev -> d_off , efault_end );
377- unsafe_put_user (ino , & dirent -> d_ino , efault_end );
378- unsafe_put_user (reclen , & dirent -> d_reclen , efault_end );
379- unsafe_put_user (d_type , & dirent -> d_type , efault_end );
380- unsafe_copy_dirent_name (dirent -> d_name , name , namlen , efault_end );
381- user_write_access_end ();
365+ scoped_user_write_access_size (prev , reclen + prev_reclen , efault ) {
366+ /* This might be 'dirent->d_off', but if so it will get overwritten */
367+ unsafe_put_user (offset , & prev -> d_off , efault );
368+ unsafe_put_user (ino , & dirent -> d_ino , efault );
369+ unsafe_put_user (reclen , & dirent -> d_reclen , efault );
370+ unsafe_put_user (d_type , & dirent -> d_type , efault );
371+ unsafe_copy_dirent_name (dirent -> d_name , name , namlen , efault );
372+ }
382373
383374 buf -> prev_reclen = reclen ;
384375 buf -> current_dir = (void __user * )dirent + reclen ;
385376 ctx -> count -= reclen ;
386377 return true;
387378
388- efault_end :
389- user_write_access_end ();
390379efault :
391380 buf -> error = - EFAULT ;
392381 return false;
@@ -458,16 +447,13 @@ static bool compat_fillonedir(struct dir_context *ctx, const char *name,
458447 }
459448 buf -> result ++ ;
460449 dirent = buf -> dirent ;
461- if (!user_write_access_begin (dirent , dirent_size (dirent , namlen + 1 )))
462- goto efault ;
463- unsafe_put_user (d_ino , & dirent -> d_ino , efault_end );
464- unsafe_put_user (offset , & dirent -> d_offset , efault_end );
465- unsafe_put_user (namlen , & dirent -> d_namlen , efault_end );
466- unsafe_copy_dirent_name (dirent -> d_name , name , namlen , efault_end );
467- user_write_access_end ();
450+ scoped_user_write_access_size (dirent , dirent_size (dirent , namlen + 1 ), efault ) {
451+ unsafe_put_user (d_ino , & dirent -> d_ino , efault );
452+ unsafe_put_user (offset , & dirent -> d_offset , efault );
453+ unsafe_put_user (namlen , & dirent -> d_namlen , efault );
454+ unsafe_copy_dirent_name (dirent -> d_name , name , namlen , efault );
455+ }
468456 return true;
469- efault_end :
470- user_write_access_end ();
471457efault :
472458 buf -> result = - EFAULT ;
473459 return false;
@@ -538,22 +524,18 @@ static bool compat_filldir(struct dir_context *ctx, const char *name, int namlen
538524 return false;
539525 dirent = buf -> current_dir ;
540526 prev = (void __user * ) dirent - prev_reclen ;
541- if (!user_write_access_begin (prev , reclen + prev_reclen ))
542- goto efault ;
543-
544- unsafe_put_user (offset , & prev -> d_off , efault_end );
545- unsafe_put_user (d_ino , & dirent -> d_ino , efault_end );
546- unsafe_put_user (reclen , & dirent -> d_reclen , efault_end );
547- unsafe_put_user (d_type , (char __user * ) dirent + reclen - 1 , efault_end );
548- unsafe_copy_dirent_name (dirent -> d_name , name , namlen , efault_end );
549- user_write_access_end ();
527+ scoped_user_write_access_size (prev , reclen + prev_reclen , efault ) {
528+ unsafe_put_user (offset , & prev -> d_off , efault );
529+ unsafe_put_user (d_ino , & dirent -> d_ino , efault );
530+ unsafe_put_user (reclen , & dirent -> d_reclen , efault );
531+ unsafe_put_user (d_type , (char __user * )dirent + reclen - 1 , efault );
532+ unsafe_copy_dirent_name (dirent -> d_name , name , namlen , efault );
533+ }
550534
551535 buf -> prev_reclen = reclen ;
552536 buf -> current_dir = (void __user * )dirent + reclen ;
553537 ctx -> count -= reclen ;
554538 return true;
555- efault_end :
556- user_write_access_end ();
557539efault :
558540 buf -> error = - EFAULT ;
559541 return false;
0 commit comments