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: 844b8292b6 ("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>
This commit is contained in:
Matthew Garrett 2018-01-11 13:07:54 -08:00 коммит произвёл John Johansen
Родитель 0dda0b3fb2
Коммит 1a3881d305
1 изменённых файлов: 5 добавлений и 4 удалений

Просмотреть файл

@ -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;