* Toshiharu Harada (haradats@xxxxxxxxxxxxx) wrote: > This patch allows LSM to check permission using "struct vfsmount" > without passing "struct vfsmount" to VFS helper functions. This is simply duplicating many of the existing checks. I don't see how this is an improvement. > --- mm.orig/fs/namei.c > +++ mm/fs/namei.c > @@ -1595,6 +1595,9 @@ int vfs_create(struct inode *dir, struct > error = security_inode_create(dir, dentry, mode); > if (error) > return error; > + error = security_path_create(dir, dentry, mode, nd); > + if (error) > + return error; Pure duplication (of course adding nameidata, although I think you just want path). > DQUOT_INIT(dir); > error = dir->i_op->create(dir, dentry, mode, nd); > if (!error) > @@ -1650,6 +1653,17 @@ int may_open(struct nameidata *nd, int a ... error = vfs_permission(nd, acc_mode); if (error) return error; ... > return -EPERM; > > /* > + * security_inode_permission() called from vfs_permission() > + * can't know that the file is going to be truncated when > + * open(filename, O_WRONLY | O_TRUNC | O_APPEND) is used. > + * So, this hook checks O_APPEND and O_TRUNC flags as well > + * as MAY_READ and MAY_WRITE flags. > + */ > + error = security_path_open(nd->path.dentry, nd->path.mnt, flag); > + if (error) > + return error; Also duplication. And why the unique flag handling, you don't seem to ever check? > + > + /* > * Ensure there are no outstanding leases on the file. > */ > error = break_lease(inode, flag); > @@ -2021,7 +2035,12 @@ fail: > } > EXPORT_SYMBOL_GPL(lookup_create); > > -int vfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev) > +/* > + * These pre_vfs_*() functions are separated from vfs_*() functions so that > + * LSM's security_path_*() functions can do DAC checks before MAC checks > + * without duplicating may_create()/may_delete() functions. > + */ > +int pre_vfs_mknod(struct inode *dir, struct dentry *dentry, int mode) > { > int error = may_create(dir, dentry, NULL); > > @@ -2033,6 +2052,14 @@ int vfs_mknod(struct inode *dir, struct > > if (!dir->i_op || !dir->i_op->mknod) > return -EPERM; > + return 0; > +} > + > +int vfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev) > +{ > + int error = pre_vfs_mknod(dir, dentry, mode); > + if (error) > + return error; More duplication, you'll get a call chain like: sys_mknod security_path_mknod pre_vfs_mknod vfs_mknod pre_vfs_mknod security_inode_mknod -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html