Prev: open("a/",O_NOFOLLOW) fails with ELOOP if "a" is a symbolic link to a directory.
Next: [PATCH -v3] Only honor the FIGETBSZ ioctl for regular files and directories
From: Theodore Ts'o on 14 Jun 2010 10:20 FIGETBSZ has an ioctl number of _IO(0x00,2) == 2, which can conflict with device driver ioctls. Let's avoid the potential for problems by only honoring the ioctl number for files where this ioctl is likely going to be useful: for regular files and directories Thanks to Johannes Stezenbach for pointing this consequence of commit 19ba0559. Signed-off-by: "Theodore Ts'o" <tytso(a)mit.edu> Cc: Al Viro <viro(a)ZenIV.linux.org.uk> Cc: "Aneesh Kumar K.V" <aneesh.kumar(a)linux.vnet.ibm.com> Cc: Johannes Stezenbach <js(a)sig21.net> --- Fixed up commit description fs/compat_ioctl.c | 6 +++++- fs/ioctl.c | 5 ++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/fs/compat_ioctl.c b/fs/compat_ioctl.c index 641640d..b8607fe 100644 --- a/fs/compat_ioctl.c +++ b/fs/compat_ioctl.c @@ -1715,8 +1715,12 @@ asmlinkage long compat_sys_ioctl(unsigned int fd, unsigned int cmd, goto out_fput; #endif - case FIBMAP: case FIGETBSZ: + if (S_ISDIR(filp->f_path.dentry->d_inode->i_mode)) + break; + /*FALL THROUGH */ + + case FIBMAP: case FIONREAD: if (S_ISREG(filp->f_path.dentry->d_inode->i_mode)) break; diff --git a/fs/ioctl.c b/fs/ioctl.c index 2d140a7..e578dab 100644 --- a/fs/ioctl.c +++ b/fs/ioctl.c @@ -597,7 +597,10 @@ int do_vfs_ioctl(struct file *filp, unsigned int fd, unsigned int cmd, { struct inode *inode = filp->f_path.dentry->d_inode; int __user *p = (int __user *)arg; - return put_user(inode->i_sb->s_blocksize, p); + + if (S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode)) + return put_user(inode->i_sb->s_blocksize, p); + /* FALL THROUGH */ } default: -- 1.7.0.4 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ |