Commit 1f939c6b authored by John Johansen's avatar John Johansen

apparmor: Fix regression in stacking due to label flags

The unconfined label flag is not being computed correctly. It
should only be set if all the profiles in the vector are set, which
is different than what is required for the debug and stale flag
that are set if any on the profile flags are set.

Fixes: c1ed5da1 ("apparmor: allow label to carry debug flags")
Signed-off-by: default avatarJohn Johansen <john.johansen@canonical.com>
parent 961f3e3d
...@@ -197,15 +197,18 @@ static bool vec_is_stale(struct aa_profile **vec, int n) ...@@ -197,15 +197,18 @@ static bool vec_is_stale(struct aa_profile **vec, int n)
return false; return false;
} }
static long union_vec_flags(struct aa_profile **vec, int n, long mask) static long accum_vec_flags(struct aa_profile **vec, int n)
{ {
long u = 0; long u = FLAG_UNCONFINED;
int i; int i;
AA_BUG(!vec); AA_BUG(!vec);
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
u |= vec[i]->label.flags & mask; u |= vec[i]->label.flags & (FLAG_DEBUG1 | FLAG_DEBUG2 |
FLAG_STALE);
if (!(u & vec[i]->label.flags & FLAG_UNCONFINED))
u &= ~FLAG_UNCONFINED;
} }
return u; return u;
...@@ -1097,8 +1100,7 @@ static struct aa_label *label_merge_insert(struct aa_label *new, ...@@ -1097,8 +1100,7 @@ static struct aa_label *label_merge_insert(struct aa_label *new,
else if (k == b->size) else if (k == b->size)
return aa_get_label(b); return aa_get_label(b);
} }
new->flags |= union_vec_flags(new->vec, new->size, FLAG_UNCONFINED | new->flags |= accum_vec_flags(new->vec, new->size);
FLAG_DEBUG1 | FLAG_DEBUG2);
ls = labels_set(new); ls = labels_set(new);
write_lock_irqsave(&ls->lock, flags); write_lock_irqsave(&ls->lock, flags);
label = __label_insert(labels_set(new), new, false); label = __label_insert(labels_set(new), new, false);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment