lkml.org 
[lkml]   [2021]   [Jul]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.13 545/800] ieee802154: hwsim: Fix memory leak in hwsim_add_one
    Date
    From: Dongliang Mu <mudongliangabcd@gmail.com>

    [ Upstream commit 28a5501c3383f0e6643012c187b7c2027ef42aea ]

    No matter from hwsim_remove or hwsim_del_radio_nl, hwsim_del fails to
    remove the entry in the edges list. Take the example below, phy0, phy1
    and e0 will be deleted, resulting in e1 not freed and accessed in the
    future.

    hwsim_phys
    |
    ------------------------------
    | |
    phy0 (edges) phy1 (edges)
    ----> e1 (idx = 1) ----> e0 (idx = 0)

    Fix this by deleting and freeing all the entries in the edges list
    between hwsim_edge_unsubscribe_me and list_del(&phy->list).

    Reported-by: syzbot+b80c9959009a9325cdff@syzkaller.appspotmail.com
    Fixes: 1c9f4a3fce77 ("ieee802154: hwsim: fix rcu handling")
    Signed-off-by: Dongliang Mu <mudongliangabcd@gmail.com>
    Acked-by: Alexander Aring <aahringo@redhat.com>
    Link: https://lore.kernel.org/r/20210616020901.2759466-1-mudongliangabcd@gmail.com
    Signed-off-by: Stefan Schmidt <stefan@datenfreihafen.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/net/ieee802154/mac802154_hwsim.c | 5 +++++
    1 file changed, 5 insertions(+)

    diff --git a/drivers/net/ieee802154/mac802154_hwsim.c b/drivers/net/ieee802154/mac802154_hwsim.c
    index 366eaae3550a..baa7e21b7f4f 100644
    --- a/drivers/net/ieee802154/mac802154_hwsim.c
    +++ b/drivers/net/ieee802154/mac802154_hwsim.c
    @@ -824,12 +824,17 @@ err_pib:
    static void hwsim_del(struct hwsim_phy *phy)
    {
    struct hwsim_pib *pib;
    + struct hwsim_edge *e;

    hwsim_edge_unsubscribe_me(phy);

    list_del(&phy->list);

    rcu_read_lock();
    + list_for_each_entry_rcu(e, &phy->edges, list) {
    + list_del_rcu(&e->list);
    + hwsim_free_edge(e);
    + }
    pib = rcu_dereference(phy->pib);
    rcu_read_unlock();

    --
    2.30.2


    \
     
     \ /
      Last update: 2021-07-12 10:46    [W:4.785 / U:1.444 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site