Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f2831e20 authored by Bob Copeland's avatar Bob Copeland Committed by Johannes Berg
Browse files

mac80211_hwsim: fix error handling in tx_frame_nl



Correct two problems with the error handling when using the netlink
forwarding API: first, the netlink skb is never freed if nla_put()
fails; and second, genlmsg_unicast() can fail if the netlink socket
is full.  In the latter case, the corresponding data skb is not counted
as a drop and userspace programs like wmediumd will see TCP stalls
due to lost packets.

Signed-off-by: default avatarBob Copeland <me@bobcopeland.com>
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 6514890f
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -946,7 +946,8 @@ static void mac80211_hwsim_tx_frame_nl(struct ieee80211_hw *hw,
		goto nla_put_failure;

	genlmsg_end(skb, msg_head);
	genlmsg_unicast(&init_net, skb, dst_portid);
	if (genlmsg_unicast(&init_net, skb, dst_portid))
		goto err_free_txskb;

	/* Enqueue the packet */
	skb_queue_tail(&data->pending, my_skb);
@@ -955,6 +956,8 @@ static void mac80211_hwsim_tx_frame_nl(struct ieee80211_hw *hw,
	return;

nla_put_failure:
	nlmsg_free(skb);
err_free_txskb:
	printk(KERN_DEBUG "mac80211_hwsim: error occurred in %s\n", __func__);
	ieee80211_free_txskb(hw, my_skb);
	data->tx_failed++;