diff
     struct cfg80211_coalesce new_coalesce = {};
     struct cfg80211_coalesce *n_coalesce;
     int err, rem_rule, n_rules = 0, i, j;
+    bool allocation_success = false;
     struct nlattr *rule;
     struct cfg80211_coalesce_rules *tmp_rule;

     // ... (existing code)

     new_coalesce.rules = kcalloc(n_rules, sizeof(new_coalesce.rules[0]),
                                  GFP_KERNEL);
-    if (!new_coalesce.rules)
+    if (!new_coalesce.rules) {
         return -ENOMEM;
+    }
+    allocation_success = true;

     // ... (existing code)

 error:
+    if (allocation_success) {
         for (i = 0; i < new_coalesce.n_rules; i++) {
             tmp_rule = &new_coalesce.rules[i];
             for (j = 0; j < tmp_rule->n_patterns; j++)
                 kfree(tmp_rule->patterns[j].mask);
             kfree(tmp_rule->patterns);
         }
         kfree(new_coalesce.rules);
+    }
