add a vfs_permission helper
Subsystems (4)
PATCH 1/2 add a vfs_permission helper
Most permission() calls have a struct nameidata * available. This helper takes that as an argument and thus makes sure we pass it down for lookup intents and prepares for per-mount read-only support where we need a struct vfsmount for checking whether a file is writeable.
Signed-off-by Christoph Hellwig <[email protected]>
fs/exec.c +2 -2
@@ -134,7 +134,7 @@if (!S_ISREG (nd.dentry->d_inode->i_mode)) goto exit; - error =permission (nd.dentry->d_inode,MAY_READ |MAY_EXEC , &nd); + error =vfs_permission (&nd,MAY_READ |MAY_EXEC );if (error) goto exit;
@@ -494,7 +494,7 @@ file =ERR_PTR (-EACCES );if (!(nd.mnt->mnt_flags &MNT_NOEXEC ) &&S_ISREG (inode->i_mode)) { -int err =permission (inode,MAY_EXEC , &nd); +int err =vfs_permission (&nd,MAY_EXEC );if (!err && !(inode->i_mode &0111 )) err = -EACCES ; file =ERR_PTR (err);
fs/inotify.c +1 -1
@@ -372,7 +372,7 @@if (error)return error;/* you can only watch an inode if you have read permissions on it */ - error =permission (nd->dentry->d_inode,MAY_READ ,NULL ); + error =vfs_permission (nd,MAY_READ );if (error)path_release (nd);return error;
fs/namei.c +19 -4
@@ -256,6 +256,21 @@return security_inode_permission (inode, mask, nd); } +/** +* vfs_permission - check for access rights to a given path +* @nd: lookup result that describes the path +* @mask: right to check for (%MAY_READ, %MAY_WRITE, %MAY_EXEC) +* +* Used to check for read/write/execute permissions on a path. +* We use "fsuid" for this, letting us set arbitrary permissions +* for filesystem access without changing the "normal" uids which +* are used for other things. +*/ +int vfs_permission (struct nameidata *nd,int mask) +{ +return permission (nd->dentry->d_inode, mask, nd); +} +/* * get_write_access() gets write permission for a file. * put_write_access() releases this write permission.
@@ -765,9 +780,8 @@ nd->flags |=LOOKUP_CONTINUE ; err =exec_permission_lite (inode, nd); -if (err == -EAGAIN ) { - err =permission (inode,MAY_EXEC , nd); - } +if (err == -EAGAIN ) + err =vfs_permission (nd,MAY_EXEC );if (err)break ;
@@ -1407,7 +1421,7 @@if (S_ISDIR (inode->i_mode) && (flag &FMODE_WRITE ))return -EISDIR ; - error =permission (inode, acc_mode, nd); + error =vfs_permission (nd, acc_mode);if (error)return error;
@@ -2536,6 +2550,7 @@EXPORT_SYMBOL (path_release);EXPORT_SYMBOL (path_walk);EXPORT_SYMBOL (permission); +EXPORT_SYMBOL (vfs_permission);EXPORT_SYMBOL (unlock_rename);EXPORT_SYMBOL (vfs_create);EXPORT_SYMBOL (vfs_follow_link);
fs/namespace.c +1 -1
@@ -516,7 +516,7 @@if (current->uid != nd->dentry->d_inode->i_uid) return -EPERM; } -if (permission (nd->dentry->d_inode,MAY_WRITE , nd)) +if (vfs_permission (nd,MAY_WRITE ))return -EPERM ;return 0 ;#endif
fs/open.c +6 -6
@@ -236,7 +236,7 @@if (!S_ISREG (inode->i_mode)) goto dput_and_out; - error =permission (inode,MAY_WRITE ,&nd); + error =vfs_permission (&nd,MAY_WRITE );if (error) goto dput_and_out;
@@ -390,7 +390,7 @@ goto dput_and_out;if (current->fsuid != inode->i_uid && - (error =permission (inode,MAY_WRITE ,&nd)) !=0 ) + (error =vfs_permission (&nd,MAY_WRITE )) !=0 ) goto dput_and_out; }down (&inode->i_sem);
@@ -443,7 +443,7 @@ goto dput_and_out;if (current->fsuid != inode->i_uid && - (error =permission (inode,MAY_WRITE ,&nd)) !=0 ) + (error =vfs_permission (&nd,MAY_WRITE )) !=0 ) goto dput_and_out; }down (&inode->i_sem);
@@ -502,7 +502,7 @@ res =__user_walk (filename,LOOKUP_FOLLOW |LOOKUP_ACCESS , &nd);if (!res) { - res =permission (nd.dentry->d_inode, mode, &nd); + res =vfs_permission (&nd, mode);/* SuS v2 requires we report a read only fs too */ if (!res && (mode &S_IWOTH ) &&IS_RDONLY (nd.dentry->d_inode) && !special_file (nd.dentry->d_inode->i_mode))
@@ -526,7 +526,7 @@if (error) goto out; - error =permission (nd.dentry->d_inode,MAY_EXEC ,&nd); + error =vfs_permission (&nd,MAY_EXEC );if (error) goto dput_and_out;
@@ -577,7 +577,7 @@if (error) goto out; - error =permission (nd.dentry->d_inode,MAY_EXEC ,&nd); + error =vfs_permission (&nd,MAY_EXEC );if (error) goto dput_and_out;
include/linux/fs.h +1 -0
@@ -862,6 +862,7 @@/* * VFS helper functions.. */ +extern int vfs_permission (struct nameidata *,int );extern int vfs_create (struct inode *,struct dentry *,int ,struct nameidata *);extern int vfs_mkdir (struct inode *,struct dentry *,int );extern int vfs_mknod (struct inode *,struct dentry *,int ,dev_t );
net/unix/af_unix.c +1 -1
@@ -676,7 +676,7 @@ err =path_lookup (sunname->sun_path,LOOKUP_FOLLOW , &nd);if (err) goto fail; - err =permission (nd.dentry->d_inode,MAY_WRITE , &nd); + err =vfs_permission (&nd,MAY_WRITE );if (err) goto put_fail;