Merge tag 'apparmor-pr-2022-12-14' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-block.git] / security / apparmor / policy_unpack.c
index 1bf8cfb8700aa68d6c04236a7fecf90827fee8ef..66915653108c63ef1b5544347bfda4b9c4a0a6a9 100644 (file)
@@ -14,6 +14,7 @@
  */
 
 #include <asm/unaligned.h>
+#include <kunit/visibility.h>
 #include <linux/ctype.h>
 #include <linux/errno.h>
 #include <linux/zstd.h>
 #include "include/policy_unpack.h"
 #include "include/policy_compat.h"
 
-
-/*
- * The AppArmor interface treats data as a type byte followed by the
- * actual data.  The interface has the notion of a named entry
- * which has a name (AA_NAME typecode followed by name string) followed by
- * the entries typecode and data.  Named types allow for optional
- * elements and extensions to be added and tested for without breaking
- * backwards compatibility.
- */
-
-enum aa_code {
-       AA_U8,
-       AA_U16,
-       AA_U32,
-       AA_U64,
-       AA_NAME,                /* same as string except it is items name */
-       AA_STRING,
-       AA_BLOB,
-       AA_STRUCT,
-       AA_STRUCTEND,
-       AA_LIST,
-       AA_LISTEND,
-       AA_ARRAY,
-       AA_ARRAYEND,
-};
-
-/*
- * aa_ext is the read of the buffer containing the serialized profile.  The
- * data is copied into a kernel buffer in apparmorfs and then handed off to
- * the unpack routines.
- */
-struct aa_ext {
-       void *start;
-       void *end;
-       void *pos;              /* pointer to current position in the buffer */
-       u32 version;
-};
-
-#define tri int
-#define TRI_TRUE 1
-#define TRI_NONE 0
-#define TRI_FALSE -1
-
 /* audit callback for unpack fields */
 static void audit_cb(struct audit_buffer *ab, void *va)
 {
@@ -197,10 +155,11 @@ struct aa_loaddata *aa_loaddata_alloc(size_t size)
 }
 
 /* test if read will be in packed data bounds */
-static bool inbounds(struct aa_ext *e, size_t size)
+VISIBLE_IF_KUNIT bool aa_inbounds(struct aa_ext *e, size_t size)
 {
        return (size <= e->end - e->pos);
 }
+EXPORT_SYMBOL_IF_KUNIT(aa_inbounds);
 
 static void *kvmemdup(const void *src, size_t len)
 {
@@ -212,22 +171,22 @@ static void *kvmemdup(const void *src, size_t len)
 }
 
 /**
- * unpack_u16_chunk - test and do bounds checking for a u16 size based chunk
+ * aa_unpack_u16_chunk - test and do bounds checking for a u16 size based chunk
  * @e: serialized data read head (NOT NULL)
  * @chunk: start address for chunk of data (NOT NULL)
  *
  * Returns: the size of chunk found with the read head at the end of the chunk.
  */
-static size_t unpack_u16_chunk(struct aa_ext *e, char **chunk)
+VISIBLE_IF_KUNIT size_t aa_unpack_u16_chunk(struct aa_ext *e, char **chunk)
 {
        size_t size = 0;
        void *pos = e->pos;
 
-       if (!inbounds(e, sizeof(u16)))
+       if (!aa_inbounds(e, sizeof(u16)))
                goto fail;
        size = le16_to_cpu(get_unaligned((__le16 *) e->pos));
        e->pos += sizeof(__le16);
-       if (!inbounds(e, size))
+       if (!aa_inbounds(e, size))
                goto fail;
        *chunk = e->pos;
        e->pos += size;
@@ -237,20 +196,22 @@ fail:
        e->pos = pos;
        return 0;
 }
+EXPORT_SYMBOL_IF_KUNIT(aa_unpack_u16_chunk);
 
 /* unpack control byte */
-static bool unpack_X(struct aa_ext *e, enum aa_code code)
+VISIBLE_IF_KUNIT bool aa_unpack_X(struct aa_ext *e, enum aa_code code)
 {
-       if (!inbounds(e, 1))
+       if (!aa_inbounds(e, 1))
                return false;
        if (*(u8 *) e->pos != code)
                return false;
        e->pos++;
        return true;
 }
+EXPORT_SYMBOL_IF_KUNIT(aa_unpack_X);
 
 /**
- * unpack_nameX - check is the next element is of type X with a name of @name
+ * aa_unpack_nameX - check is the next element is of type X with a name of @name
  * @e: serialized data extent information  (NOT NULL)
  * @code: type code
  * @name: name to match to the serialized element.  (MAYBE NULL)
@@ -265,7 +226,7 @@ static bool unpack_X(struct aa_ext *e, enum aa_code code)
  *
  * Returns: false if either match fails, the read head does not move
  */
-static bool unpack_nameX(struct aa_ext *e, enum aa_code code, const char *name)
+VISIBLE_IF_KUNIT bool aa_unpack_nameX(struct aa_ext *e, enum aa_code code, const char *name)
 {
        /*
         * May need to reset pos if name or type doesn't match
@@ -275,9 +236,9 @@ static bool unpack_nameX(struct aa_ext *e, enum aa_code code, const char *name)
         * Check for presence of a tagname, and if present name size
         * AA_NAME tag value is a u16.
         */
-       if (unpack_X(e, AA_NAME)) {
+       if (aa_unpack_X(e, AA_NAME)) {
                char *tag = NULL;
-               size_t size = unpack_u16_chunk(e, &tag);
+               size_t size = aa_unpack_u16_chunk(e, &tag);
                /* if a name is specified it must match. otherwise skip tag */
                if (name && (!size || tag[size-1] != '\0' || strcmp(name, tag)))
                        goto fail;
@@ -287,20 +248,21 @@ static bool unpack_nameX(struct aa_ext *e, enum aa_code code, const char *name)
        }
 
        /* now check if type code matches */
-       if (unpack_X(e, code))
+       if (aa_unpack_X(e, code))
                return true;
 
 fail:
        e->pos = pos;
        return false;
 }
+EXPORT_SYMBOL_IF_KUNIT(aa_unpack_nameX);
 
 static bool unpack_u8(struct aa_ext *e, u8 *data, const char *name)
 {
        void *pos = e->pos;
 
-       if (unpack_nameX(e, AA_U8, name)) {
-               if (!inbounds(e, sizeof(u8)))
+       if (aa_unpack_nameX(e, AA_U8, name)) {
+               if (!aa_inbounds(e, sizeof(u8)))
                        goto fail;
                if (data)
                        *data = *((u8 *)e->pos);
@@ -313,12 +275,12 @@ fail:
        return false;
 }
 
-static bool unpack_u32(struct aa_ext *e, u32 *data, const char *name)
+VISIBLE_IF_KUNIT bool aa_unpack_u32(struct aa_ext *e, u32 *data, const char *name)
 {
        void *pos = e->pos;
 
-       if (unpack_nameX(e, AA_U32, name)) {
-               if (!inbounds(e, sizeof(u32)))
+       if (aa_unpack_nameX(e, AA_U32, name)) {
+               if (!aa_inbounds(e, sizeof(u32)))
                        goto fail;
                if (data)
                        *data = le32_to_cpu(get_unaligned((__le32 *) e->pos));
@@ -330,13 +292,14 @@ fail:
        e->pos = pos;
        return false;
 }
+EXPORT_SYMBOL_IF_KUNIT(aa_unpack_u32);
 
-static bool unpack_u64(struct aa_ext *e, u64 *data, const char *name)
+VISIBLE_IF_KUNIT bool aa_unpack_u64(struct aa_ext *e, u64 *data, const char *name)
 {
        void *pos = e->pos;
 
-       if (unpack_nameX(e, AA_U64, name)) {
-               if (!inbounds(e, sizeof(u64)))
+       if (aa_unpack_nameX(e, AA_U64, name)) {
+               if (!aa_inbounds(e, sizeof(u64)))
                        goto fail;
                if (data)
                        *data = le64_to_cpu(get_unaligned((__le64 *) e->pos));
@@ -348,36 +311,37 @@ fail:
        e->pos = pos;
        return false;
 }
+EXPORT_SYMBOL_IF_KUNIT(aa_unpack_u64);
 
-static tri unpack_array(struct aa_ext *e, const char *name, u16 *size)
+VISIBLE_IF_KUNIT bool aa_unpack_array(struct aa_ext *e, const char *name, u16 *size)
 {
        void *pos = e->pos;
 
-       if (unpack_nameX(e, AA_ARRAY, name)) {
-               if (!inbounds(e, sizeof(u16)))
+       if (aa_unpack_nameX(e, AA_ARRAY, name)) {
+               if (!aa_inbounds(e, sizeof(u16)))
                        goto fail;
                *size = le16_to_cpu(get_unaligned((__le16 *) e->pos));
                e->pos += sizeof(u16);
-               return TRI_TRUE;
+               return true;
        }
 
-       return TRI_NONE;
 fail:
        e->pos = pos;
-       return TRI_FALSE;
+       return false;
 }
+EXPORT_SYMBOL_IF_KUNIT(aa_unpack_array);
 
-static size_t unpack_blob(struct aa_ext *e, char **blob, const char *name)
+VISIBLE_IF_KUNIT size_t aa_unpack_blob(struct aa_ext *e, char **blob, const char *name)
 {
        void *pos = e->pos;
 
-       if (unpack_nameX(e, AA_BLOB, name)) {
+       if (aa_unpack_nameX(e, AA_BLOB, name)) {
                u32 size;
-               if (!inbounds(e, sizeof(u32)))
+               if (!aa_inbounds(e, sizeof(u32)))
                        goto fail;
                size = le32_to_cpu(get_unaligned((__le32 *) e->pos));
                e->pos += sizeof(u32);
-               if (inbounds(e, (size_t) size)) {
+               if (aa_inbounds(e, (size_t) size)) {
                        *blob = e->pos;
                        e->pos += size;
                        return size;
@@ -388,15 +352,16 @@ fail:
        e->pos = pos;
        return 0;
 }
+EXPORT_SYMBOL_IF_KUNIT(aa_unpack_blob);
 
-static int unpack_str(struct aa_ext *e, const char **string, const char *name)
+VISIBLE_IF_KUNIT int aa_unpack_str(struct aa_ext *e, const char **string, const char *name)
 {
        char *src_str;
        size_t size = 0;
        void *pos = e->pos;
        *string = NULL;
-       if (unpack_nameX(e, AA_STRING, name)) {
-               size = unpack_u16_chunk(e, &src_str);
+       if (aa_unpack_nameX(e, AA_STRING, name)) {
+               size = aa_unpack_u16_chunk(e, &src_str);
                if (size) {
                        /* strings are null terminated, length is size - 1 */
                        if (src_str[size - 1] != 0)
@@ -411,12 +376,13 @@ fail:
        e->pos = pos;
        return 0;
 }
+EXPORT_SYMBOL_IF_KUNIT(aa_unpack_str);
 
-static int unpack_strdup(struct aa_ext *e, char **string, const char *name)
+VISIBLE_IF_KUNIT int aa_unpack_strdup(struct aa_ext *e, char **string, const char *name)
 {
        const char *tmp;
        void *pos = e->pos;
-       int res = unpack_str(e, &tmp, name);
+       int res = aa_unpack_str(e, &tmp, name);
        *string = NULL;
 
        if (!res)
@@ -430,6 +396,7 @@ static int unpack_strdup(struct aa_ext *e, char **string, const char *name)
 
        return res;
 }
+EXPORT_SYMBOL_IF_KUNIT(aa_unpack_strdup);
 
 
 /**
@@ -445,7 +412,7 @@ static struct aa_dfa *unpack_dfa(struct aa_ext *e, int flags)
        size_t size;
        struct aa_dfa *dfa = NULL;
 
-       size = unpack_blob(e, &blob, "aadfa");
+       size = aa_unpack_blob(e, &blob, "aadfa");
        if (size) {
                /*
                 * The dfa is aligned with in the blob to 8 bytes
@@ -480,11 +447,11 @@ static bool unpack_trans_table(struct aa_ext *e, struct aa_str_table *strs)
        char **table = NULL;
 
        /* exec table is optional */
-       if (unpack_nameX(e, AA_STRUCT, "xtable")) {
+       if (aa_unpack_nameX(e, AA_STRUCT, "xtable")) {
                u16 size;
                int i;
 
-               if (unpack_array(e, NULL, &size) != TRI_TRUE)
+               if (!aa_unpack_array(e, NULL, &size))
                        /*
                         * Note: index into trans table array is a max
                         * of 2^24, but unpack array can only unpack
@@ -498,8 +465,8 @@ static bool unpack_trans_table(struct aa_ext *e, struct aa_str_table *strs)
 
                for (i = 0; i < size; i++) {
                        char *str;
-                       int c, j, pos, size2 = unpack_strdup(e, &str, NULL);
-                       /* unpack_strdup verifies that the last character is
+                       int c, j, pos, size2 = aa_unpack_strdup(e, &str, NULL);
+                       /* aa_unpack_strdup verifies that the last character is
                         * null termination byte.
                         */
                        if (!size2)
@@ -522,7 +489,7 @@ static bool unpack_trans_table(struct aa_ext *e, struct aa_str_table *strs)
                                        goto fail;
                                /* beginning with : requires an embedded \0,
                                 * verify that exactly 1 internal \0 exists
-                                * trailing \0 already verified by unpack_strdup
+                                * trailing \0 already verified by aa_unpack_strdup
                                 *
                                 * convert \0 back to : for label_parse
                                 */
@@ -534,9 +501,9 @@ static bool unpack_trans_table(struct aa_ext *e, struct aa_str_table *strs)
                                /* fail - all other cases with embedded \0 */
                                goto fail;
                }
-               if (!unpack_nameX(e, AA_ARRAYEND, NULL))
+               if (!aa_unpack_nameX(e, AA_ARRAYEND, NULL))
                        goto fail;
-               if (!unpack_nameX(e, AA_STRUCTEND, NULL))
+               if (!aa_unpack_nameX(e, AA_STRUCTEND, NULL))
                        goto fail;
 
                strs->table = table;
@@ -554,23 +521,23 @@ static bool unpack_xattrs(struct aa_ext *e, struct aa_profile *profile)
 {
        void *pos = e->pos;
 
-       if (unpack_nameX(e, AA_STRUCT, "xattrs")) {
+       if (aa_unpack_nameX(e, AA_STRUCT, "xattrs")) {
                u16 size;
                int i;
 
-               if (unpack_array(e, NULL, &size) != TRI_TRUE)
+               if (!aa_unpack_array(e, NULL, &size))
                        goto fail;
                profile->attach.xattr_count = size;
                profile->attach.xattrs = kcalloc(size, sizeof(char *), GFP_KERNEL);
                if (!profile->attach.xattrs)
                        goto fail;
                for (i = 0; i < size; i++) {
-                       if (!unpack_strdup(e, &profile->attach.xattrs[i], NULL))
+                       if (!aa_unpack_strdup(e, &profile->attach.xattrs[i], NULL))
                                goto fail;
                }
-               if (!unpack_nameX(e, AA_ARRAYEND, NULL))
+               if (!aa_unpack_nameX(e, AA_ARRAYEND, NULL))
                        goto fail;
-               if (!unpack_nameX(e, AA_STRUCTEND, NULL))
+               if (!aa_unpack_nameX(e, AA_STRUCTEND, NULL))
                        goto fail;
        }
 
@@ -587,8 +554,8 @@ static bool unpack_secmark(struct aa_ext *e, struct aa_ruleset *rules)
        u16 size;
        int i;
 
-       if (unpack_nameX(e, AA_STRUCT, "secmark")) {
-               if (unpack_array(e, NULL, &size) != TRI_TRUE)
+       if (aa_unpack_nameX(e, AA_STRUCT, "secmark")) {
+               if (!aa_unpack_array(e, NULL, &size))
                        goto fail;
 
                rules->secmark = kcalloc(size, sizeof(struct aa_secmark),
@@ -603,12 +570,12 @@ static bool unpack_secmark(struct aa_ext *e, struct aa_ruleset *rules)
                                goto fail;
                        if (!unpack_u8(e, &rules->secmark[i].deny, NULL))
                                goto fail;
-                       if (!unpack_strdup(e, &rules->secmark[i].label, NULL))
+                       if (!aa_unpack_strdup(e, &rules->secmark[i].label, NULL))
                                goto fail;
                }
-               if (!unpack_nameX(e, AA_ARRAYEND, NULL))
+               if (!aa_unpack_nameX(e, AA_ARRAYEND, NULL))
                        goto fail;
-               if (!unpack_nameX(e, AA_STRUCTEND, NULL))
+               if (!aa_unpack_nameX(e, AA_STRUCTEND, NULL))
                        goto fail;
        }
 
@@ -632,27 +599,27 @@ static bool unpack_rlimits(struct aa_ext *e, struct aa_ruleset *rules)
        void *pos = e->pos;
 
        /* rlimits are optional */
-       if (unpack_nameX(e, AA_STRUCT, "rlimits")) {
+       if (aa_unpack_nameX(e, AA_STRUCT, "rlimits")) {
                u16 size;
                int i;
                u32 tmp = 0;
-               if (!unpack_u32(e, &tmp, NULL))
+               if (!aa_unpack_u32(e, &tmp, NULL))
                        goto fail;
                rules->rlimits.mask = tmp;
 
-               if (unpack_array(e, NULL, &size) != TRI_TRUE ||
+               if (!aa_unpack_array(e, NULL, &size) ||
                    size > RLIM_NLIMITS)
                        goto fail;
                for (i = 0; i < size; i++) {
                        u64 tmp2 = 0;
                        int a = aa_map_resource(i);
-                       if (!unpack_u64(e, &tmp2, NULL))
+                       if (!aa_unpack_u64(e, &tmp2, NULL))
                                goto fail;
                        rules->rlimits.limits[a].rlim_max = tmp2;
                }
-               if (!unpack_nameX(e, AA_ARRAYEND, NULL))
+               if (!aa_unpack_nameX(e, AA_ARRAYEND, NULL))
                        goto fail;
-               if (!unpack_nameX(e, AA_STRUCTEND, NULL))
+               if (!aa_unpack_nameX(e, AA_STRUCTEND, NULL))
                        goto fail;
        }
        return true;
@@ -664,27 +631,23 @@ fail:
 
 static bool unpack_perm(struct aa_ext *e, u32 version, struct aa_perms *perm)
 {
-       bool res;
-
        if (version != 1)
                return false;
 
-       res = unpack_u32(e, &perm->allow, NULL);
-       res = res && unpack_u32(e, &perm->allow, NULL);
-       res = res && unpack_u32(e, &perm->deny, NULL);
-       res = res && unpack_u32(e, &perm->subtree, NULL);
-       res = res && unpack_u32(e, &perm->cond, NULL);
-       res = res && unpack_u32(e, &perm->kill, NULL);
-       res = res && unpack_u32(e, &perm->complain, NULL);
-       res = res && unpack_u32(e, &perm->prompt, NULL);
-       res = res && unpack_u32(e, &perm->audit, NULL);
-       res = res && unpack_u32(e, &perm->quiet, NULL);
-       res = res && unpack_u32(e, &perm->hide, NULL);
-       res = res && unpack_u32(e, &perm->xindex, NULL);
-       res = res && unpack_u32(e, &perm->tag, NULL);
-       res = res && unpack_u32(e, &perm->label, NULL);
-
-       return res;
+       return  aa_unpack_u32(e, &perm->allow, NULL) &&
+               aa_unpack_u32(e, &perm->allow, NULL) &&
+               aa_unpack_u32(e, &perm->deny, NULL) &&
+               aa_unpack_u32(e, &perm->subtree, NULL) &&
+               aa_unpack_u32(e, &perm->cond, NULL) &&
+               aa_unpack_u32(e, &perm->kill, NULL) &&
+               aa_unpack_u32(e, &perm->complain, NULL) &&
+               aa_unpack_u32(e, &perm->prompt, NULL) &&
+               aa_unpack_u32(e, &perm->audit, NULL) &&
+               aa_unpack_u32(e, &perm->quiet, NULL) &&
+               aa_unpack_u32(e, &perm->hide, NULL) &&
+               aa_unpack_u32(e, &perm->xindex, NULL) &&
+               aa_unpack_u32(e, &perm->tag, NULL) &&
+               aa_unpack_u32(e, &perm->label, NULL);
 }
 
 static ssize_t unpack_perms_table(struct aa_ext *e, struct aa_perms **perms)
@@ -697,13 +660,13 @@ static ssize_t unpack_perms_table(struct aa_ext *e, struct aa_perms **perms)
         * policy perms are optional, in which case perms are embedded
         * in the dfa accept table
         */
-       if (unpack_nameX(e, AA_STRUCT, "perms")) {
+       if (aa_unpack_nameX(e, AA_STRUCT, "perms")) {
                int i;
                u32 version;
 
-               if (!unpack_u32(e, &version, "version"))
+               if (!aa_unpack_u32(e, &version, "version"))
                        goto fail_reset;
-               if (unpack_array(e, NULL, &size) != TRI_TRUE)
+               if (!aa_unpack_array(e, NULL, &size))
                        goto fail_reset;
                *perms = kcalloc(size, sizeof(struct aa_perms), GFP_KERNEL);
                if (!*perms)
@@ -712,9 +675,9 @@ static ssize_t unpack_perms_table(struct aa_ext *e, struct aa_perms **perms)
                        if (!unpack_perm(e, version, &(*perms)[i]))
                                goto fail;
                }
-               if (!unpack_nameX(e, AA_ARRAYEND, NULL))
+               if (!aa_unpack_nameX(e, AA_ARRAYEND, NULL))
                        goto fail;
-               if (!unpack_nameX(e, AA_STRUCTEND, NULL))
+               if (!aa_unpack_nameX(e, AA_STRUCTEND, NULL))
                        goto fail;
        } else
                *perms = NULL;
@@ -774,10 +737,10 @@ static int unpack_pdb(struct aa_ext *e, struct aa_policydb *policy,
         * sadly start was given different names for file and policydb
         * but since it is optional we can try both
         */
-       if (!unpack_u32(e, &policy->start[0], "start"))
+       if (!aa_unpack_u32(e, &policy->start[0], "start"))
                /* default start state */
                policy->start[0] = DFA_START;
-       if (!unpack_u32(e, &policy->start[AA_CLASS_FILE], "dfa_start")) {
+       if (!aa_unpack_u32(e, &policy->start[AA_CLASS_FILE], "dfa_start")) {
                /* default start state for xmatch and file dfa */
                policy->start[AA_CLASS_FILE] = DFA_START;
        }       /* setup class index */
@@ -839,9 +802,9 @@ static struct aa_profile *unpack_profile(struct aa_ext *e, char **ns_name)
        *ns_name = NULL;
 
        /* check that we have the right struct being passed */
-       if (!unpack_nameX(e, AA_STRUCT, "profile"))
+       if (!aa_unpack_nameX(e, AA_STRUCT, "profile"))
                goto fail;
-       if (!unpack_str(e, &name, NULL))
+       if (!aa_unpack_str(e, &name, NULL))
                goto fail;
        if (*name == '\0')
                goto fail;
@@ -866,10 +829,10 @@ static struct aa_profile *unpack_profile(struct aa_ext *e, char **ns_name)
        rules = list_first_entry(&profile->rules, typeof(*rules), list);
 
        /* profile renaming is optional */
-       (void) unpack_str(e, &profile->rename, "rename");
+       (void) aa_unpack_str(e, &profile->rename, "rename");
 
        /* attachment string is optional */
-       (void) unpack_str(e, &profile->attach.xmatch_str, "attach");
+       (void) aa_unpack_str(e, &profile->attach.xmatch_str, "attach");
 
        /* xmatch is optional and may be NULL */
        error = unpack_pdb(e, &profile->attach.xmatch, false, false, &info);
@@ -880,7 +843,7 @@ static struct aa_profile *unpack_profile(struct aa_ext *e, char **ns_name)
 
        /* neither xmatch_len not xmatch_perms are optional if xmatch is set */
        if (profile->attach.xmatch.dfa) {
-               if (!unpack_u32(e, &tmp, NULL)) {
+               if (!aa_unpack_u32(e, &tmp, NULL)) {
                        info = "missing xmatch len";
                        goto fail;
                }
@@ -894,15 +857,15 @@ static struct aa_profile *unpack_profile(struct aa_ext *e, char **ns_name)
        }
 
        /* disconnected attachment string is optional */
-       (void) unpack_str(e, &profile->disconnected, "disconnected");
+       (void) aa_unpack_str(e, &profile->disconnected, "disconnected");
 
        /* per profile debug flags (complain, audit) */
-       if (!unpack_nameX(e, AA_STRUCT, "flags")) {
+       if (!aa_unpack_nameX(e, AA_STRUCT, "flags")) {
                info = "profile missing flags";
                goto fail;
        }
        info = "failed to unpack profile flags";
-       if (!unpack_u32(e, &tmp, NULL))
+       if (!aa_unpack_u32(e, &tmp, NULL))
                goto fail;
        if (tmp & PACKED_FLAG_HAT)
                profile->label.flags |= FLAG_HAT;
@@ -910,7 +873,7 @@ static struct aa_profile *unpack_profile(struct aa_ext *e, char **ns_name)
                profile->label.flags |= FLAG_DEBUG1;
        if (tmp & PACKED_FLAG_DEBUG2)
                profile->label.flags |= FLAG_DEBUG2;
-       if (!unpack_u32(e, &tmp, NULL))
+       if (!aa_unpack_u32(e, &tmp, NULL))
                goto fail;
        if (tmp == PACKED_MODE_COMPLAIN || (e->version & FORCE_COMPLAIN_FLAG)) {
                profile->mode = APPARMOR_COMPLAIN;
@@ -926,16 +889,16 @@ static struct aa_profile *unpack_profile(struct aa_ext *e, char **ns_name)
        } else {
                goto fail;
        }
-       if (!unpack_u32(e, &tmp, NULL))
+       if (!aa_unpack_u32(e, &tmp, NULL))
                goto fail;
        if (tmp)
                profile->audit = AUDIT_ALL;
 
-       if (!unpack_nameX(e, AA_STRUCTEND, NULL))
+       if (!aa_unpack_nameX(e, AA_STRUCTEND, NULL))
                goto fail;
 
        /* path_flags is optional */
-       if (unpack_u32(e, &profile->path_flags, "path_flags"))
+       if (aa_unpack_u32(e, &profile->path_flags, "path_flags"))
                profile->path_flags |= profile->label.flags &
                        PATH_MEDIATE_DELETED;
        else
@@ -943,38 +906,38 @@ static struct aa_profile *unpack_profile(struct aa_ext *e, char **ns_name)
                profile->path_flags = PATH_MEDIATE_DELETED;
 
        info = "failed to unpack profile capabilities";
-       if (!unpack_u32(e, &(rules->caps.allow.cap[0]), NULL))
+       if (!aa_unpack_u32(e, &(rules->caps.allow.cap[0]), NULL))
                goto fail;
-       if (!unpack_u32(e, &(rules->caps.audit.cap[0]), NULL))
+       if (!aa_unpack_u32(e, &(rules->caps.audit.cap[0]), NULL))
                goto fail;
-       if (!unpack_u32(e, &(rules->caps.quiet.cap[0]), NULL))
+       if (!aa_unpack_u32(e, &(rules->caps.quiet.cap[0]), NULL))
                goto fail;
-       if (!unpack_u32(e, &tmpcap.cap[0], NULL))
+       if (!aa_unpack_u32(e, &tmpcap.cap[0], NULL))
                goto fail;
 
        info = "failed to unpack upper profile capabilities";
-       if (unpack_nameX(e, AA_STRUCT, "caps64")) {
+       if (aa_unpack_nameX(e, AA_STRUCT, "caps64")) {
                /* optional upper half of 64 bit caps */
-               if (!unpack_u32(e, &(rules->caps.allow.cap[1]), NULL))
+               if (!aa_unpack_u32(e, &(rules->caps.allow.cap[1]), NULL))
                        goto fail;
-               if (!unpack_u32(e, &(rules->caps.audit.cap[1]), NULL))
+               if (!aa_unpack_u32(e, &(rules->caps.audit.cap[1]), NULL))
                        goto fail;
-               if (!unpack_u32(e, &(rules->caps.quiet.cap[1]), NULL))
+               if (!aa_unpack_u32(e, &(rules->caps.quiet.cap[1]), NULL))
                        goto fail;
-               if (!unpack_u32(e, &(tmpcap.cap[1]), NULL))
+               if (!aa_unpack_u32(e, &(tmpcap.cap[1]), NULL))
                        goto fail;
-               if (!unpack_nameX(e, AA_STRUCTEND, NULL))
+               if (!aa_unpack_nameX(e, AA_STRUCTEND, NULL))
                        goto fail;
        }
 
        info = "failed to unpack extended profile capabilities";
-       if (unpack_nameX(e, AA_STRUCT, "capsx")) {
+       if (aa_unpack_nameX(e, AA_STRUCT, "capsx")) {
                /* optional extended caps mediation mask */
-               if (!unpack_u32(e, &(rules->caps.extended.cap[0]), NULL))
+               if (!aa_unpack_u32(e, &(rules->caps.extended.cap[0]), NULL))
                        goto fail;
-               if (!unpack_u32(e, &(rules->caps.extended.cap[1]), NULL))
+               if (!aa_unpack_u32(e, &(rules->caps.extended.cap[1]), NULL))
                        goto fail;
-               if (!unpack_nameX(e, AA_STRUCTEND, NULL))
+               if (!aa_unpack_nameX(e, AA_STRUCTEND, NULL))
                        goto fail;
        }
 
@@ -993,7 +956,7 @@ static struct aa_profile *unpack_profile(struct aa_ext *e, char **ns_name)
                goto fail;
        }
 
-       if (unpack_nameX(e, AA_STRUCT, "policydb")) {
+       if (aa_unpack_nameX(e, AA_STRUCT, "policydb")) {
                /* generic policy dfa - optional and may be NULL */
                info = "failed to unpack policydb";
                error = unpack_pdb(e, &rules->policy, true, false,
@@ -1007,7 +970,7 @@ static struct aa_profile *unpack_profile(struct aa_ext *e, char **ns_name)
                          aa_dfa_next(rules->policy.dfa,
                                      rules->policy.start[0],
                                      AA_CLASS_FILE);
-               if (!unpack_nameX(e, AA_STRUCTEND, NULL))
+               if (!aa_unpack_nameX(e, AA_STRUCTEND, NULL))
                        goto fail;
                error = aa_compat_map_policy(&rules->policy, e->version);
                if (error) {
@@ -1035,7 +998,7 @@ static struct aa_profile *unpack_profile(struct aa_ext *e, char **ns_name)
                rules->file.dfa = aa_get_dfa(nulldfa);
 
        error = -EPROTO;
-       if (unpack_nameX(e, AA_STRUCT, "data")) {
+       if (aa_unpack_nameX(e, AA_STRUCT, "data")) {
                info = "out of memory";
                profile->data = kzalloc(sizeof(*profile->data), GFP_KERNEL);
                if (!profile->data) {
@@ -1054,7 +1017,7 @@ static struct aa_profile *unpack_profile(struct aa_ext *e, char **ns_name)
                        goto fail;
                }
 
-               while (unpack_strdup(e, &key, NULL)) {
+               while (aa_unpack_strdup(e, &key, NULL)) {
                        data = kzalloc(sizeof(*data), GFP_KERNEL);
                        if (!data) {
                                kfree_sensitive(key);
@@ -1063,7 +1026,7 @@ static struct aa_profile *unpack_profile(struct aa_ext *e, char **ns_name)
                        }
 
                        data->key = key;
-                       data->size = unpack_blob(e, &data->data, NULL);
+                       data->size = aa_unpack_blob(e, &data->data, NULL);
                        data->data = kvmemdup(data->data, data->size);
                        if (data->size && !data->data) {
                                kfree_sensitive(data->key);
@@ -1076,13 +1039,13 @@ static struct aa_profile *unpack_profile(struct aa_ext *e, char **ns_name)
                                               profile->data->p);
                }
 
-               if (!unpack_nameX(e, AA_STRUCTEND, NULL)) {
+               if (!aa_unpack_nameX(e, AA_STRUCTEND, NULL)) {
                        info = "failed to unpack end of key, value data table";
                        goto fail;
                }
        }
 
-       if (!unpack_nameX(e, AA_STRUCTEND, NULL)) {
+       if (!aa_unpack_nameX(e, AA_STRUCTEND, NULL)) {
                info = "failed to unpack end of profile";
                goto fail;
        }
@@ -1122,7 +1085,7 @@ static int verify_header(struct aa_ext *e, int required, const char **ns)
        *ns = NULL;
 
        /* get the interface version */
-       if (!unpack_u32(e, &e->version, "version")) {
+       if (!aa_unpack_u32(e, &e->version, "version")) {
                if (required) {
                        audit_iface(NULL, NULL, NULL, "invalid profile format",
                                    e, error);
@@ -1141,7 +1104,7 @@ static int verify_header(struct aa_ext *e, int required, const char **ns)
        }
 
        /* read the namespace if present */
-       if (unpack_str(e, &name, "namespace")) {
+       if (aa_unpack_str(e, &name, "namespace")) {
                if (*name == '\0') {
                        audit_iface(NULL, NULL, NULL, "invalid namespace name",
                                    e, error);
@@ -1471,7 +1434,3 @@ fail:
 
        return error;
 }
-
-#ifdef CONFIG_SECURITY_APPARMOR_KUNIT_TEST
-#include "policy_unpack_test.c"
-#endif /* CONFIG_SECURITY_APPARMOR_KUNIT_TEST */