When rhashtable insertion fails the mesh table code doesn't free
the now-orphan mesh path object.  This patch fixes that.

Signed-off-by: Herbert Xu <herb...@gondor.apana.org.au>
---

 net/mac80211/mesh_pathtbl.c |   12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/net/mac80211/mesh_pathtbl.c b/net/mac80211/mesh_pathtbl.c
index 884a0d212e8b..db5a1aef22db 100644
--- a/net/mac80211/mesh_pathtbl.c
+++ b/net/mac80211/mesh_pathtbl.c
@@ -436,17 +436,18 @@ struct mesh_path *mesh_path_add(struct 
ieee80211_sub_if_data *sdata,
        } while (unlikely(ret == -EEXIST && !mpath));
        spin_unlock_bh(&tbl->walk_lock);
 
-       if (ret && ret != -EEXIST)
+       if (ret)
+               kfree(new_mpath);
+
+       if (ret != -EEXIST)
                return ERR_PTR(ret);
 
        /* At this point either new_mpath was added, or we found a
         * matching entry already in the table; in the latter case
         * free the unnecessary new entry.
         */
-       if (ret == -EEXIST) {
-               kfree(new_mpath);
+       if (ret == -EEXIST)
                new_mpath = mpath;
-       }
        sdata->u.mesh.mesh_paths_generation++;
        return new_mpath;
 }
@@ -481,6 +482,9 @@ int mpp_path_add(struct ieee80211_sub_if_data *sdata,
                hlist_add_head_rcu(&new_mpath->walk_list, &tbl->walk_head);
        spin_unlock_bh(&tbl->walk_lock);
 
+       if (ret)
+               kfree(new_mpath);
+
        sdata->u.mesh.mpp_paths_generation++;
        return ret;
 }

Reply via email to