mac802154: fix llsec key resources release in mac802154_llsec_key_del
[linux-2.6-block.git] / net / mac802154 / llsec.c
index 8d2eabc71bbeb04358dc04bb40e3ac03188e6380..f13b07ebfb98a66b2dc48896ea35f6195b164157 100644 (file)
@@ -265,19 +265,27 @@ fail:
        return -ENOMEM;
 }
 
+static void mac802154_llsec_key_del_rcu(struct rcu_head *rcu)
+{
+       struct ieee802154_llsec_key_entry *pos;
+       struct mac802154_llsec_key *mkey;
+
+       pos = container_of(rcu, struct ieee802154_llsec_key_entry, rcu);
+       mkey = container_of(pos->key, struct mac802154_llsec_key, key);
+
+       llsec_key_put(mkey);
+       kfree_sensitive(pos);
+}
+
 int mac802154_llsec_key_del(struct mac802154_llsec *sec,
                            const struct ieee802154_llsec_key_id *key)
 {
        struct ieee802154_llsec_key_entry *pos;
 
        list_for_each_entry(pos, &sec->table.keys, list) {
-               struct mac802154_llsec_key *mkey;
-
-               mkey = container_of(pos->key, struct mac802154_llsec_key, key);
-
                if (llsec_key_id_equal(&pos->id, key)) {
                        list_del_rcu(&pos->list);
-                       llsec_key_put(mkey);
+                       call_rcu(&pos->rcu, mac802154_llsec_key_del_rcu);
                        return 0;
                }
        }