Skip to content

Commit 391b746

Browse files
author
Al Viro
committed
switch readdir(2) to unsafe_copy_dirent_name()
... and the same for its compat counterpart Signed-off-by: Al Viro <[email protected]>
1 parent b44f687 commit 391b746

File tree

1 file changed

+16
-14
lines changed

1 file changed

+16
-14
lines changed

fs/readdir.c

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -157,17 +157,18 @@ static int fillonedir(struct dir_context *ctx, const char *name, int namlen,
157157
}
158158
buf->result++;
159159
dirent = buf->dirent;
160-
if (!access_ok(dirent,
160+
if (!user_write_access_begin(dirent,
161161
(unsigned long)(dirent->d_name + namlen + 1) -
162162
(unsigned long)dirent))
163163
goto efault;
164-
if ( __put_user(d_ino, &dirent->d_ino) ||
165-
__put_user(offset, &dirent->d_offset) ||
166-
__put_user(namlen, &dirent->d_namlen) ||
167-
__copy_to_user(dirent->d_name, name, namlen) ||
168-
__put_user(0, dirent->d_name + namlen))
169-
goto efault;
164+
unsafe_put_user(d_ino, &dirent->d_ino, efault_end);
165+
unsafe_put_user(offset, &dirent->d_offset, efault_end);
166+
unsafe_put_user(namlen, &dirent->d_namlen, efault_end);
167+
unsafe_copy_dirent_name(dirent->d_name, name, namlen, efault_end);
168+
user_write_access_end();
170169
return 0;
170+
efault_end:
171+
user_write_access_end();
171172
efault:
172173
buf->result = -EFAULT;
173174
return -EFAULT;
@@ -424,17 +425,18 @@ static int compat_fillonedir(struct dir_context *ctx, const char *name,
424425
}
425426
buf->result++;
426427
dirent = buf->dirent;
427-
if (!access_ok(dirent,
428+
if (!user_write_access_begin(dirent,
428429
(unsigned long)(dirent->d_name + namlen + 1) -
429430
(unsigned long)dirent))
430431
goto efault;
431-
if ( __put_user(d_ino, &dirent->d_ino) ||
432-
__put_user(offset, &dirent->d_offset) ||
433-
__put_user(namlen, &dirent->d_namlen) ||
434-
__copy_to_user(dirent->d_name, name, namlen) ||
435-
__put_user(0, dirent->d_name + namlen))
436-
goto efault;
432+
unsafe_put_user(d_ino, &dirent->d_ino, efault_end);
433+
unsafe_put_user(offset, &dirent->d_offset, efault_end);
434+
unsafe_put_user(namlen, &dirent->d_namlen, efault_end);
435+
unsafe_copy_dirent_name(dirent->d_name, name, namlen, efault_end);
436+
user_write_access_end();
437437
return 0;
438+
efault_end:
439+
user_write_access_end();
438440
efault:
439441
buf->result = -EFAULT;
440442
return -EFAULT;

0 commit comments

Comments
 (0)