Commit ed676760 authored by Hirofumi Ogawa's avatar Hirofumi Ogawa Committed by Linus Torvalds

[PATCH] more VFAT_IOCTL_READDIR_BOTH/_SHORT ioctl fixes (1/11)

    - check the ioctl cmd first
    - check the directory whether it's an already dead
parent 890bdcd4
...@@ -647,9 +647,23 @@ int fat_dir_ioctl(struct inode * inode, struct file * filp, ...@@ -647,9 +647,23 @@ int fat_dir_ioctl(struct inode * inode, struct file * filp,
unsigned int cmd, unsigned long arg) unsigned int cmd, unsigned long arg)
{ {
struct fat_ioctl_filldir_callback buf; struct fat_ioctl_filldir_callback buf;
struct dirent __user *d1 = (struct dirent *)arg; struct dirent __user *d1;
int ret, shortname, both; int ret, shortname, both;
switch (cmd) {
case VFAT_IOCTL_READDIR_SHORT:
shortname = 1;
both = 1;
break;
case VFAT_IOCTL_READDIR_BOTH:
shortname = 0;
both = 1;
break;
default:
return -EINVAL;
}
d1 = (struct dirent *)arg;
if (!access_ok(VERIFY_WRITE, d1, sizeof(struct dirent[2]))) if (!access_ok(VERIFY_WRITE, d1, sizeof(struct dirent[2])))
return -EFAULT; return -EFAULT;
/* /*
...@@ -662,20 +676,13 @@ int fat_dir_ioctl(struct inode * inode, struct file * filp, ...@@ -662,20 +676,13 @@ int fat_dir_ioctl(struct inode * inode, struct file * filp,
buf.dirent = d1; buf.dirent = d1;
buf.result = 0; buf.result = 0;
switch (cmd) { down(&inode->i_sem);
case VFAT_IOCTL_READDIR_SHORT: ret = -ENOENT;
shortname = 1; if (!IS_DEADDIR(inode)) {
both = 1; ret = fat_readdirx(inode, filp, &buf, fat_ioctl_filldir,
break; shortname, both);
case VFAT_IOCTL_READDIR_BOTH:
shortname = 0;
both = 1;
break;
default:
return -EINVAL;
} }
ret = fat_readdirx(inode, filp, &buf, fat_ioctl_filldir, up(&inode->i_sem);
shortname, both);
if (ret >= 0) if (ret >= 0)
ret = buf.result; ret = buf.result;
return ret; return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment