>From 3bce55d24ef7a55613d748182aac1f3986c144da Mon Sep 17 00:00:00 2001 From: Tetsuo Handa <penguin-kernel@xxxxxxxxxxxxxxxxxxx> Date: Thu, 24 Apr 2014 20:07:58 +0900 Subject: [PATCH (for 3.15) 3/5] AppArmor: Handle the rename flags. For AppArmor, the RENAME_EXCHANGE flag means "check permissions with reversed arguments". Future patches will stop re-calculating pathnames. Signed-off-by: Tetsuo Handa <penguin-kernel@xxxxxxxxxxxxxxxxxxx> --- security/apparmor/lsm.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.c index c0b4366..b04218a 100644 --- a/security/apparmor/lsm.c +++ b/security/apparmor/lsm.c @@ -332,6 +332,7 @@ static int apparmor_path_rename(struct path *old_dir, struct dentry *old_dentry, old_dentry->d_inode->i_mode }; +retry: error = aa_path_perm(OP_RENAME_SRC, profile, &old_path, 0, MAY_READ | AA_MAY_META_READ | MAY_WRITE | AA_MAY_META_WRITE | AA_MAY_DELETE, @@ -340,6 +341,17 @@ static int apparmor_path_rename(struct path *old_dir, struct dentry *old_dentry, error = aa_path_perm(OP_RENAME_DEST, profile, &new_path, 0, MAY_WRITE | AA_MAY_META_WRITE | AA_MAY_CREATE, &cond); + if (!error && (flags & RENAME_EXCHANGE)) { + /* Cross rename requires both inodes to exist. */ + old_path.mnt = new_dir->mnt; + old_path.dentry = new_dentry; + new_path.mnt = old_dir->mnt; + new_path.dentry = old_dentry; + cond.uid = new_dentry->d_inode->i_uid; + cond.mode = new_dentry->d_inode->i_mode; + flags = 0; + goto retry; + } } return error; -- 1.7.9.5 -- 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