Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7a2871b5 authored by John Johansen's avatar John Johansen
Browse files

apparmor: use common fn to clear task_context for domain transitions

parent 0ca554b9
Loading
Loading
Loading
Loading
+6 −11
Original line number Diff line number Diff line
@@ -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;
+1 −5
Original line number Diff line number Diff line
@@ -512,11 +512,7 @@ int apparmor_bprm_set_creds(struct linux_binprm *bprm)
	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,
+13 −0
Original line number Diff line number Diff line
@@ -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 */