From: Jeff Mahoney Subject: [PATCH] apparmor: convert apparmor_inode_permission to path patches.apparmor/add-security_path_permission added the ->path_permission call. This patch converts apparmor_inode_permission to apparmor_path_permission. The former is now a pass-all, which is how it behaved in 2.6.26 if a NULL nameidata was passed. Signed-off-by: Jeff Mahoney --- security/apparmor/lsm.c | 41 +++++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 14 deletions(-) --- a/security/apparmor/lsm.c +++ b/security/apparmor/lsm.c @@ -448,21 +448,9 @@ out: return error; } -static int apparmor_inode_permission(struct inode *inode, int mask, - struct nameidata *nd) +static int apparmor_inode_permission(struct inode *inode, int mask) { - int check = 0; - - if (!nd || nd->flags & (LOOKUP_PARENT | LOOKUP_CONTINUE)) - return 0; - mask = aa_mask_permissions(mask); - if (S_ISDIR(inode->i_mode)) { - check |= AA_CHECK_DIR; - /* allow traverse accesses to directories */ - mask &= ~MAY_EXEC; - } - return aa_permission("inode_permission", inode, nd->dentry, nd->mnt, - mask, check); + return 0; } static int apparmor_inode_setattr(struct dentry *dentry, struct vfsmount *mnt, @@ -656,6 +644,29 @@ static int apparmor_file_mprotect(struct !(vma->vm_flags & VM_SHARED) ? MAP_PRIVATE : 0); } +static int apparmor_path_permission(struct path *path, int mask) +{ + struct inode *inode; + int check = 0; + + if (!path) + return 0; + + inode = path->dentry->d_inode; + + mask = aa_mask_permissions(mask); + if (S_ISDIR(inode->i_mode)) { + check |= AA_CHECK_DIR; + /* allow traverse accesses to directories */ + mask &= ~MAY_EXEC; + if (!mask) + return 0; + } + + return aa_permission("inode_permission", inode, path->dentry, + path->mnt, mask, check); +} + static int apparmor_task_alloc_security(struct task_struct *task) { return aa_clone(task); @@ -800,6 +811,8 @@ struct security_operations apparmor_ops .file_mprotect = apparmor_file_mprotect, .file_lock = apparmor_file_lock, + .path_permission = apparmor_path_permission, + .task_alloc_security = apparmor_task_alloc_security, .task_free_security = apparmor_task_free_security, .task_post_setuid = cap_task_post_setuid,