}
 
 /**
- * __lookup_profile - lookup the profile matching @hname
+ * __lookupn_profile - lookup the profile matching @hname
  * @base: base list to start looking up profile name from  (NOT NULL)
  * @hname: hierarchical profile name  (NOT NULL)
+ * @n: length of @hname
  *
  * Requires: rcu_read_lock be held
  *
  *
  * Do a relative name lookup, recursing through profile tree.
  */
-static struct aa_profile *__lookup_profile(struct aa_policy *base,
-                                          const char *hname)
+static struct aa_profile *__lookupn_profile(struct aa_policy *base,
+                                           const char *hname, size_t n)
 {
        struct aa_profile *profile = NULL;
-       char *split;
+       const char *split;
 
-       for (split = strstr(hname, "//"); split;) {
+       for (split = strnstr(hname, "//", n); split;
+            split = strnstr(hname, "//", n)) {
                profile = __strn_find_child(&base->profiles, hname,
                                            split - hname);
                if (!profile)
                        return NULL;
 
                base = &profile->base;
+               n -= split + 2 - hname;
                hname = split + 2;
-               split = strstr(hname, "//");
        }
 
-       profile = __find_child(&base->profiles, hname);
+       if (n)
+               return __strn_find_child(&base->profiles, hname, n);
+       return NULL;
+}
 
-       return profile;
+static struct aa_profile *__lookup_profile(struct aa_policy *base,
+                                          const char *hname)
+{
+       return __lookupn_profile(base, hname, strlen(hname));
 }
 
 /**
  * aa_lookup_profile - find a profile by its full or partial name
  * @ns: the namespace to start from (NOT NULL)
  * @hname: name to do lookup on.  Does not contain namespace prefix (NOT NULL)
+ * @n: size of @hname
  *
  * Returns: refcounted profile or NULL if not found
  */
-struct aa_profile *aa_lookup_profile(struct aa_ns *ns, const char *hname)
+struct aa_profile *aa_lookupn_profile(struct aa_ns *ns, const char *hname,
+                                     size_t n)
 {
        struct aa_profile *profile;
 
        rcu_read_lock();
        do {
-               profile = __lookup_profile(&ns->base, hname);
+               profile = __lookupn_profile(&ns->base, hname, n);
        } while (profile && !aa_get_profile_not0(profile));
        rcu_read_unlock();
 
        /* the unconfined profile is not in the regular profile list */
-       if (!profile && strcmp(hname, "unconfined") == 0)
+       if (!profile && strncmp(hname, "unconfined", n) == 0)
                profile = aa_get_newest_profile(ns->unconfined);
 
        /* refcount released by caller */
        return profile;
 }
 
+struct aa_profile *aa_lookup_profile(struct aa_ns *ns, const char *hname)
+{
+       return aa_lookupn_profile(ns, hname, strlen(hname));
+}
 /**
  * replacement_allowed - test to see if replacement is allowed
  * @profile: profile to test if it can be replaced  (MAYBE NULL)