batman-adv: fix hardif_neigh refcount on queue_work() failure
[ Upstream commit 4c4af69008
]
The hardif_neigh refcounter is to be decreased by the queued work and
currently is never decreased if the queue_work() call fails.
Fix by checking the queue_work() return value and decrease refcount
if necessary.
Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch>
Signed-off-by: Sven Eckelmann <sven@narfation.org>
Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
pull/10/head
parent
3e9f714fb5
commit
498c536f59
|
@ -254,6 +254,7 @@ static void batadv_v_elp_periodic_work(struct work_struct *work)
|
||||||
struct batadv_priv *bat_priv;
|
struct batadv_priv *bat_priv;
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
u32 elp_interval;
|
u32 elp_interval;
|
||||||
|
bool ret;
|
||||||
|
|
||||||
bat_v = container_of(work, struct batadv_hard_iface_bat_v, elp_wq.work);
|
bat_v = container_of(work, struct batadv_hard_iface_bat_v, elp_wq.work);
|
||||||
hard_iface = container_of(bat_v, struct batadv_hard_iface, bat_v);
|
hard_iface = container_of(bat_v, struct batadv_hard_iface, bat_v);
|
||||||
|
@ -315,8 +316,11 @@ static void batadv_v_elp_periodic_work(struct work_struct *work)
|
||||||
* may sleep and that is not allowed in an rcu protected
|
* may sleep and that is not allowed in an rcu protected
|
||||||
* context. Therefore schedule a task for that.
|
* context. Therefore schedule a task for that.
|
||||||
*/
|
*/
|
||||||
queue_work(batadv_event_workqueue,
|
ret = queue_work(batadv_event_workqueue,
|
||||||
&hardif_neigh->bat_v.metric_work);
|
&hardif_neigh->bat_v.metric_work);
|
||||||
|
|
||||||
|
if (!ret)
|
||||||
|
batadv_hardif_neigh_put(hardif_neigh);
|
||||||
}
|
}
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue