diff options
author | Matthew Garrett <mjg59@google.com> | 2018-01-11 22:07:54 +0100 |
---|---|---|
committer | John Johansen <john.johansen@canonical.com> | 2018-01-13 00:56:50 +0100 |
commit | 1a3881d305592d947ed47887306919d50112394d (patch) | |
tree | 8d7c0129e2feae1259325aa7ff33ccb821d93aa2 /security/apparmor/domain.c | |
parent | apparmor: fix ptrace label match when matching stacked labels (diff) | |
download | linux-1a3881d305592d947ed47887306919d50112394d.tar.xz linux-1a3881d305592d947ed47887306919d50112394d.zip |
apparmor: Fix regression in profile conflict logic
The intended behaviour in apparmor profile matching is to flag a
conflict if two profiles match equally well. However, right now a
conflict is generated if another profile has the same match length even
if that profile doesn't actually match. Fix the logic so we only
generate a conflict if the profiles match.
Fixes: 844b8292b631 ("apparmor: ensure that undecidable profile attachments fail")
Cc: Stable <stable@vger.kernel.org>
Signed-off-by: Matthew Garrett <mjg59@google.com>
Signed-off-by: John Johansen <john.johansen@canonical.com>
Diffstat (limited to 'security/apparmor/domain.c')
-rw-r--r-- | security/apparmor/domain.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/security/apparmor/domain.c b/security/apparmor/domain.c index 04ba9d0718ea..6a54d2ffa840 100644 --- a/security/apparmor/domain.c +++ b/security/apparmor/domain.c @@ -330,10 +330,7 @@ static struct aa_profile *__attach_match(const char *name, continue; if (profile->xmatch) { - if (profile->xmatch_len == len) { - conflict = true; - continue; - } else if (profile->xmatch_len > len) { + if (profile->xmatch_len >= len) { unsigned int state; u32 perm; @@ -342,6 +339,10 @@ static struct aa_profile *__attach_match(const char *name, perm = dfa_user_allow(profile->xmatch, state); /* any accepting state means a valid match. */ if (perm & MAY_EXEC) { + if (profile->xmatch_len == len) { + conflict = true; + continue; + } candidate = profile; len = profile->xmatch_len; conflict = false; |