apparmor: fix possible memory leak in unpack_trans_table
[platform/kernel/linux-starfive.git] / security / apparmor / lib.c
index a630c95..7182a8b 100644 (file)
@@ -27,7 +27,7 @@ struct aa_perms allperms = { .allow = ALL_PERMS_MASK,
 
 /**
  * aa_free_str_table - free entries str table
- * @str: the string table to free  (MAYBE NULL)
+ * @t: the string table to free  (MAYBE NULL)
  */
 void aa_free_str_table(struct aa_str_table *t)
 {
@@ -41,6 +41,7 @@ void aa_free_str_table(struct aa_str_table *t)
                        kfree_sensitive(t->table[i]);
                kfree_sensitive(t->table);
                t->table = NULL;
+               t->size = 0;
        }
 }
 
@@ -85,6 +86,7 @@ char *aa_split_fqname(char *fqname, char **ns_name)
 /**
  * skipn_spaces - Removes leading whitespace from @str.
  * @str: The string to be stripped.
+ * @n: length of str to parse, will stop at \0 if encountered before n
  *
  * Returns a pointer to the first non-whitespace character in @str.
  * if all whitespace will return NULL
@@ -143,10 +145,10 @@ const char *aa_splitn_fqname(const char *fqname, size_t n, const char **ns_name,
 void aa_info_message(const char *str)
 {
        if (audit_enabled) {
-               DEFINE_AUDIT_DATA(sa, LSM_AUDIT_DATA_NONE, AA_CLASS_NONE, NULL);
+               DEFINE_AUDIT_DATA(ad, LSM_AUDIT_DATA_NONE, AA_CLASS_NONE, NULL);
 
-               aad(&sa)->info = str;
-               aa_audit_msg(AUDIT_APPARMOR_STATUS, &sa, NULL);
+               ad.info = str;
+               aa_audit_msg(AUDIT_APPARMOR_STATUS, &ad, NULL);
        }
        printk(KERN_INFO "AppArmor: %s\n", str);
 }
@@ -281,21 +283,22 @@ void aa_audit_perm_mask(struct audit_buffer *ab, u32 mask, const char *chrs,
 static void aa_audit_perms_cb(struct audit_buffer *ab, void *va)
 {
        struct common_audit_data *sa = va;
+       struct apparmor_audit_data *ad = aad(sa);
 
-       if (aad(sa)->request) {
+       if (ad->request) {
                audit_log_format(ab, " requested_mask=");
-               aa_audit_perm_mask(ab, aad(sa)->request, aa_file_perm_chrs,
+               aa_audit_perm_mask(ab, ad->request, aa_file_perm_chrs,
                                   PERMS_CHRS_MASK, aa_file_perm_names,
                                   PERMS_NAMES_MASK);
        }
-       if (aad(sa)->denied) {
+       if (ad->denied) {
                audit_log_format(ab, "denied_mask=");
-               aa_audit_perm_mask(ab, aad(sa)->denied, aa_file_perm_chrs,
+               aa_audit_perm_mask(ab, ad->denied, aa_file_perm_chrs,
                                   PERMS_CHRS_MASK, aa_file_perm_names,
                                   PERMS_NAMES_MASK);
        }
        audit_log_format(ab, " peer=");
-       aa_label_xaudit(ab, labels_ns(aad(sa)->label), aad(sa)->peer,
+       aa_label_xaudit(ab, labels_ns(ad->subj_label), ad->peer,
                                      FLAGS_NONE, GFP_ATOMIC);
 }
 
@@ -349,21 +352,20 @@ void aa_profile_match_label(struct aa_profile *profile,
 /* currently unused */
 int aa_profile_label_perm(struct aa_profile *profile, struct aa_profile *target,
                          u32 request, int type, u32 *deny,
-                         struct common_audit_data *sa)
+                         struct apparmor_audit_data *ad)
 {
        struct aa_ruleset *rules = list_first_entry(&profile->rules,
                                                    typeof(*rules), list);
        struct aa_perms perms;
 
-       aad(sa)->label = &profile->label;
-       aad(sa)->peer = &target->label;
-       aad(sa)->request = request;
+       ad->peer = &target->label;
+       ad->request = request;
 
        aa_profile_match_label(profile, rules, &target->label, type, request,
                               &perms);
        aa_apply_modes_to_perms(profile, &perms);
        *deny |= request & perms.deny;
-       return aa_check_perms(profile, &perms, request, sa, aa_audit_perms_cb);
+       return aa_check_perms(profile, &perms, request, ad, aa_audit_perms_cb);
 }
 
 /**
@@ -371,8 +373,7 @@ int aa_profile_label_perm(struct aa_profile *profile, struct aa_profile *target,
  * @profile: profile being checked
  * @perms: perms computed for the request
  * @request: requested perms
- * @deny: Returns: explicit deny set
- * @sa: initialized audit structure (MAY BE NULL if not auditing)
+ * @ad: initialized audit structure (MAY BE NULL if not auditing)
  * @cb: callback fn for type specific fields (MAY BE NULL)
  *
  * Returns: 0 if permission else error code
@@ -385,7 +386,7 @@ int aa_profile_label_perm(struct aa_profile *profile, struct aa_profile *target,
  *      with a positive value.
  */
 int aa_check_perms(struct aa_profile *profile, struct aa_perms *perms,
-                  u32 request, struct common_audit_data *sa,
+                  u32 request, struct apparmor_audit_data *ad,
                   void (*cb)(struct audit_buffer *, void *))
 {
        int type, error;
@@ -394,7 +395,7 @@ int aa_check_perms(struct aa_profile *profile, struct aa_perms *perms,
        if (likely(!denied)) {
                /* mask off perms that are not being force audited */
                request &= perms->audit;
-               if (!request || !sa)
+               if (!request || !ad)
                        return 0;
 
                type = AUDIT_APPARMOR_AUDIT;
@@ -413,16 +414,16 @@ int aa_check_perms(struct aa_profile *profile, struct aa_perms *perms,
                        error = -ENOENT;
 
                denied &= ~perms->quiet;
-               if (!sa || !denied)
+               if (!ad || !denied)
                        return error;
        }
 
-       if (sa) {
-               aad(sa)->label = &profile->label;
-               aad(sa)->request = request;
-               aad(sa)->denied = denied;
-               aad(sa)->error = error;
-               aa_audit_msg(type, sa, cb);
+       if (ad) {
+               ad->subj_label = &profile->label;
+               ad->request = request;
+               ad->denied = denied;
+               ad->error = error;
+               aa_audit_msg(type, ad, cb);
        }
 
        if (type == AUDIT_APPARMOR_ALLOWED)