apparmor: use common fn to clear task_context for domain transitions
authorJohn Johansen <john.johansen@canonical.com>
Tue, 19 Feb 2013 00:05:34 +0000 (16:05 -0800)
committerJohn Johansen <john.johansen@canonical.com>
Sun, 28 Apr 2013 07:36:20 +0000 (00:36 -0700)
Signed-off-by: John Johansen <john.johansen@canonical.com>
Acked-by: Steve Beattie <sbeattie@ubuntu.com>
security/apparmor/context.c
security/apparmor/domain.c
security/apparmor/include/context.h

index 611e6ce..3f911af 100644 (file)
@@ -105,16 +105,12 @@ int aa_replace_current_profile(struct aa_profile *profile)
                return -ENOMEM;
 
        cxt = new->security;
-       if (unconfined(profile) || (cxt->profile->ns != profile->ns)) {
+       if (unconfined(profile) || (cxt->profile->ns != profile->ns))
                /* if switching to unconfined or a different profile namespace
                 * clear out context state
                 */
-               aa_put_profile(cxt->previous);
-               aa_put_profile(cxt->onexec);
-               cxt->previous = NULL;
-               cxt->onexec = NULL;
-               cxt->token = 0;
-       }
+               aa_clear_task_cxt_trans(cxt);
+
        /* be careful switching cxt->profile, when racing replacement it
         * is possible that cxt->profile->replacedby is the reference keeping
         * @profile valid, so make sure to get its reference before dropping
@@ -222,11 +218,10 @@ int aa_restore_previous_profile(u64 token)
                aa_get_profile(cxt->profile);
                aa_put_profile(cxt->previous);
        }
-       /* clear exec && prev information when restoring to previous context */
+       /* ref has been transfered so avoid putting ref in clear_task_cxt */
        cxt->previous = NULL;
-       cxt->token = 0;
-       aa_put_profile(cxt->onexec);
-       cxt->onexec = NULL;
+       /* clear exec && prev information when restoring to previous context */
+       aa_clear_task_cxt_trans(cxt);
 
        commit_creds(new);
        return 0;
index fb47d5b..07fcb09 100644 (file)
@@ -512,11 +512,7 @@ x_clear:
        cxt->profile = new_profile;
 
        /* clear out all temporary/transitional state from the context */
-       aa_put_profile(cxt->previous);
-       aa_put_profile(cxt->onexec);
-       cxt->previous = NULL;
-       cxt->onexec = NULL;
-       cxt->token = 0;
+       aa_clear_task_cxt_trans(cxt);
 
 audit:
        error = aa_audit_file(profile, &perms, GFP_KERNEL, OP_EXEC, MAY_EXEC,
index 1e9443a..4cecad3 100644 (file)
@@ -160,4 +160,17 @@ static inline struct aa_profile *aa_current_profile(void)
        return profile;
 }
 
+/**
+ * aa_clear_task_cxt_trans - clear transition tracking info from the cxt
+ * @cxt: task context to clear (NOT NULL)
+ */
+static inline void aa_clear_task_cxt_trans(struct aa_task_cxt *cxt)
+{
+       aa_put_profile(cxt->previous);
+       aa_put_profile(cxt->onexec);
+       cxt->previous = NULL;
+       cxt->onexec = NULL;
+       cxt->token = 0;
+}
+
 #endif /* __AA_CONTEXT_H */