Commit 8bead5c2 authored by David S. Miller's avatar David S. Miller

Merge tag 'ieee802154-for-davem-2021-06-24' of...

Merge tag 'ieee802154-for-davem-2021-06-24' of git://git.kernel.org/pub/scm/linux/kernel/git/sschmidt/wpan

Stefan Schmidt says:

====================
pull-request: ieee802154 for net 2021-06-24

An update from ieee802154 for your *net* tree.

This time we only have fixes for ieee802154 hwsim driver.

Sparked from some syzcaller reports We got a potential
crash fix from Eric Dumazet and two memory leak fixes from
Dongliang Mu.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 2e7256f1 0303b303
...@@ -480,7 +480,7 @@ static int hwsim_del_edge_nl(struct sk_buff *msg, struct genl_info *info) ...@@ -480,7 +480,7 @@ static int hwsim_del_edge_nl(struct sk_buff *msg, struct genl_info *info)
struct hwsim_edge *e; struct hwsim_edge *e;
u32 v0, v1; u32 v0, v1;
if (!info->attrs[MAC802154_HWSIM_ATTR_RADIO_ID] && if (!info->attrs[MAC802154_HWSIM_ATTR_RADIO_ID] ||
!info->attrs[MAC802154_HWSIM_ATTR_RADIO_EDGE]) !info->attrs[MAC802154_HWSIM_ATTR_RADIO_EDGE])
return -EINVAL; return -EINVAL;
...@@ -715,6 +715,8 @@ static int hwsim_subscribe_all_others(struct hwsim_phy *phy) ...@@ -715,6 +715,8 @@ static int hwsim_subscribe_all_others(struct hwsim_phy *phy)
return 0; return 0;
sub_fail:
hwsim_edge_unsubscribe_me(phy);
me_fail: me_fail:
rcu_read_lock(); rcu_read_lock();
list_for_each_entry_rcu(e, &phy->edges, list) { list_for_each_entry_rcu(e, &phy->edges, list) {
...@@ -722,8 +724,6 @@ static int hwsim_subscribe_all_others(struct hwsim_phy *phy) ...@@ -722,8 +724,6 @@ static int hwsim_subscribe_all_others(struct hwsim_phy *phy)
hwsim_free_edge(e); hwsim_free_edge(e);
} }
rcu_read_unlock(); rcu_read_unlock();
sub_fail:
hwsim_edge_unsubscribe_me(phy);
return -ENOMEM; return -ENOMEM;
} }
...@@ -824,12 +824,17 @@ static int hwsim_add_one(struct genl_info *info, struct device *dev, ...@@ -824,12 +824,17 @@ static int hwsim_add_one(struct genl_info *info, struct device *dev,
static void hwsim_del(struct hwsim_phy *phy) static void hwsim_del(struct hwsim_phy *phy)
{ {
struct hwsim_pib *pib; struct hwsim_pib *pib;
struct hwsim_edge *e;
hwsim_edge_unsubscribe_me(phy); hwsim_edge_unsubscribe_me(phy);
list_del(&phy->list); list_del(&phy->list);
rcu_read_lock(); 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); pib = rcu_dereference(phy->pib);
rcu_read_unlock(); rcu_read_unlock();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment