apparmor: fix replacement bug that adds new child to old parent
authorJohn Johansen <john.johansen@canonical.com>
Mon, 11 Apr 2016 23:57:19 +0000 (16:57 -0700)
committerJohn Johansen <john.johansen@canonical.com>
Tue, 12 Jul 2016 15:43:10 +0000 (08:43 -0700)
When set atomic replacement is used and the parent is updated before the
child, and the child did not exist in the old parent so there is no
direct replacement then the new child is incorrectly added to the old
parent. This results in the new parent not having the child(ren) that
it should and the old parent when being destroyed asserting the
following error.

AppArmor: policy_destroy: internal error, policy '<profile/name>' still
contains profiles

Signed-off-by: John Johansen <john.johansen@canonical.com>
Acked-by: Seth Arnold <seth.arnold@canonical.com>
security/apparmor/policy.c

index 222052f64e2cc127b0a013165cb04f2c0b122160..c92a9f6c1be5d6b7dbfab321ca70234a335560d5 100644 (file)
@@ -1193,7 +1193,7 @@ ssize_t aa_replace_profiles(void *udata, size_t size, bool noreplace)
                        /* aafs interface uses replacedby */
                        rcu_assign_pointer(ent->new->replacedby->profile,
                                           aa_get_profile(ent->new));
-                       __list_add_profile(&parent->base.profiles, ent->new);
+                       __list_add_profile(&newest->base.profiles, ent->new);
                        aa_put_profile(newest);
                } else {
                        /* aafs interface uses replacedby */