netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Nicolas Boichat <drinkcat@chromium.org>,
	Wen Gong <wgong@codeaurora.org>,
	Kalle Valo <kvalo@codeaurora.org>,
	Sasha Levin <sashal@kernel.org>,
	ath10k@lists.infradead.org, linux-wireless@vger.kernel.org,
	netdev@vger.kernel.org
Subject: [PATCH AUTOSEL 4.14 299/371] ath10k: adjust skb length in ath10k_sdio_mbox_rx_packet
Date: Thu, 16 Jan 2020 12:22:51 -0500	[thread overview]
Message-ID: <20200116172403.18149-242-sashal@kernel.org> (raw)
In-Reply-To: <20200116172403.18149-1-sashal@kernel.org>

From: Nicolas Boichat <drinkcat@chromium.org>

[ Upstream commit b7139960832eb56fa15d390a4b5c8c5739bd0d1a ]

When the FW bundles multiple packets, pkt->act_len may be incorrect
as it refers to the first packet only (however, the FW will only
bundle packets that fit into the same pkt->alloc_len).

Before this patch, the skb length would be set (incorrectly) to
pkt->act_len in ath10k_sdio_mbox_rx_packet, and then later manually
adjusted in ath10k_sdio_mbox_rx_process_packet.

The first problem is that ath10k_sdio_mbox_rx_process_packet does not
use proper skb_put commands to adjust the length (it directly changes
skb->len), so we end up with a mismatch between skb->head + skb->tail
and skb->data + skb->len. This is quite serious, and causes corruptions
in the TCP stack, as the stack tries to coalesce packets, and relies
on skb->tail being correct (that is, skb_tail_pointer must point to
the first byte_after_ the data).

Instead of re-adjusting the size in ath10k_sdio_mbox_rx_process_packet,
this moves the code to ath10k_sdio_mbox_rx_packet, and also add a
bounds check, as skb_put would crash the kernel if not enough space is
available.

Tested with QCA6174 SDIO with firmware
WLAN.RMH.4.4.1-00007-QCARMSWP-1.

Fixes: 8530b4e7b22bc3b ("ath10k: sdio: set skb len for all rx packets")
Signed-off-by: Nicolas Boichat <drinkcat@chromium.org>
Signed-off-by: Wen Gong <wgong@codeaurora.org>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 drivers/net/wireless/ath/ath10k/sdio.c | 29 +++++++++++++++++++-------
 1 file changed, 21 insertions(+), 8 deletions(-)

diff --git a/drivers/net/wireless/ath/ath10k/sdio.c b/drivers/net/wireless/ath/ath10k/sdio.c
index 0a1248ebccf5..f49b21b137c1 100644
--- a/drivers/net/wireless/ath/ath10k/sdio.c
+++ b/drivers/net/wireless/ath/ath10k/sdio.c
@@ -392,16 +392,11 @@ static int ath10k_sdio_mbox_rx_process_packet(struct ath10k *ar,
 	struct ath10k_htc_hdr *htc_hdr = (struct ath10k_htc_hdr *)skb->data;
 	bool trailer_present = htc_hdr->flags & ATH10K_HTC_FLAG_TRAILER_PRESENT;
 	enum ath10k_htc_ep_id eid;
-	u16 payload_len;
 	u8 *trailer;
 	int ret;
 
-	payload_len = le16_to_cpu(htc_hdr->len);
-	skb->len = payload_len + sizeof(struct ath10k_htc_hdr);
-
 	if (trailer_present) {
-		trailer = skb->data + sizeof(*htc_hdr) +
-			  payload_len - htc_hdr->trailer_len;
+		trailer = skb->data + skb->len - htc_hdr->trailer_len;
 
 		eid = pipe_id_to_eid(htc_hdr->eid);
 
@@ -635,13 +630,31 @@ static int ath10k_sdio_mbox_rx_packet(struct ath10k *ar,
 {
 	struct ath10k_sdio *ar_sdio = ath10k_sdio_priv(ar);
 	struct sk_buff *skb = pkt->skb;
+	struct ath10k_htc_hdr *htc_hdr;
 	int ret;
 
 	ret = ath10k_sdio_readsb(ar, ar_sdio->mbox_info.htc_addr,
 				 skb->data, pkt->alloc_len);
+	if (ret)
+		goto out;
+
+	/* Update actual length. The original length may be incorrect,
+	 * as the FW will bundle multiple packets as long as their sizes
+	 * fit within the same aligned length (pkt->alloc_len).
+	 */
+	htc_hdr = (struct ath10k_htc_hdr *)skb->data;
+	pkt->act_len = le16_to_cpu(htc_hdr->len) + sizeof(*htc_hdr);
+	if (pkt->act_len > pkt->alloc_len) {
+		ath10k_warn(ar, "rx packet too large (%zu > %zu)\n",
+			    pkt->act_len, pkt->alloc_len);
+		ret = -EMSGSIZE;
+		goto out;
+	}
+
+	skb_put(skb, pkt->act_len);
+
+out:
 	pkt->status = ret;
-	if (!ret)
-		skb_put(skb, pkt->act_len);
 
 	return ret;
 }
-- 
2.20.1


  parent reply	other threads:[~2020-01-16 17:29 UTC|newest]

Thread overview: 71+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20200116172403.18149-1-sashal@kernel.org>
2020-01-16 17:18 ` [PATCH AUTOSEL 4.14 067/371] iwlwifi: mvm: avoid possible access out of array Sasha Levin
2020-01-16 17:19 ` [PATCH AUTOSEL 4.14 068/371] net/mlx5: Take lock with IRQs disabled to avoid deadlock Sasha Levin
2020-01-16 17:19 ` [PATCH AUTOSEL 4.14 069/371] iwlwifi: mvm: fix A-MPDU reference assignment Sasha Levin
2020-01-16 17:19 ` [PATCH AUTOSEL 4.14 080/371] iwlwifi: mvm: fix RSS config command Sasha Levin
2020-01-16 17:19 ` [PATCH AUTOSEL 4.14 084/371] net: phy: fixed_phy: Fix fixed_phy not checking GPIO Sasha Levin
2020-01-16 17:19 ` [PATCH AUTOSEL 4.14 110/371] net: dsa: qca8k: Enable delay for RGMII_ID mode Sasha Levin
2020-01-16 17:19 ` [PATCH AUTOSEL 4.14 126/371] netfilter: nft_set_hash: fix lookups with fixed size hash on big endian Sasha Levin
2020-01-16 17:20 ` [PATCH AUTOSEL 4.14 128/371] net: aquantia: fixed instack structure overflow Sasha Levin
2020-01-16 17:20 ` [PATCH AUTOSEL 4.14 135/371] net: sh_eth: fix a missing check of of_get_phy_mode Sasha Levin
2020-01-16 17:20 ` [PATCH AUTOSEL 4.14 143/371] tipc: tipc clang warning Sasha Levin
2020-01-16 17:20 ` [PATCH AUTOSEL 4.14 154/371] dccp: Fix memleak in __feat_register_sp Sasha Levin
2020-01-16 17:20 ` [PATCH AUTOSEL 4.14 157/371] ehea: Fix a copy-paste err in ehea_init_port_res Sasha Levin
2020-01-16 17:20 ` [PATCH AUTOSEL 4.14 161/371] net: hns3: fix for vport->bw_limit overflow problem Sasha Levin
2020-01-16 17:20 ` [PATCH AUTOSEL 4.14 164/371] tipc: set sysctl_tipc_rmem and named_timeout right range Sasha Levin
2020-01-16 17:20 ` [PATCH AUTOSEL 4.14 169/371] 6lowpan: Off by one handling ->nexthdr Sasha Levin
2020-01-16 17:20 ` [PATCH AUTOSEL 4.14 176/371] packet: in recvmsg msg_name return at least sizeof sockaddr_ll Sasha Levin
2020-01-16 17:20 ` [PATCH AUTOSEL 4.14 182/371] net: ena: fix swapped parameters when calling ena_com_indirect_table_fill_entry Sasha Levin
2020-01-16 17:20 ` [PATCH AUTOSEL 4.14 183/371] net: ena: fix: Free napi resources when ena_up() fails Sasha Levin
2020-01-16 17:20 ` [PATCH AUTOSEL 4.14 184/371] net: ena: fix incorrect test of supported hash function Sasha Levin
2020-01-16 17:20 ` [PATCH AUTOSEL 4.14 185/371] net: ena: fix ena_com_fill_hash_function() implementation Sasha Levin
2020-01-16 17:21 ` [PATCH AUTOSEL 4.14 192/371] l2tp: Fix possible NULL pointer dereference Sasha Levin
2020-01-16 17:21 ` [PATCH AUTOSEL 4.14 197/371] netfilter: ebtables: CONFIG_COMPAT: reject trailing data after last rule Sasha Levin
2020-01-16 17:21 ` [PATCH AUTOSEL 4.14 220/371] inet: frags: call inet_frags_fini() after unregister_pernet_subsys() Sasha Levin
2020-01-16 17:21 ` [PATCH AUTOSEL 4.14 221/371] netvsc: unshare skb in VF rx handler Sasha Levin
2020-01-16 17:21 ` [PATCH AUTOSEL 4.14 225/371] mpls: fix warning with multi-label encap Sasha Levin
2020-01-16 17:21 ` [PATCH AUTOSEL 4.14 227/371] qed: iWARP - Use READ_ONCE and smp_store_release to access ep->state Sasha Levin
2020-01-16 17:21 ` [PATCH AUTOSEL 4.14 231/371] net: netem: fix backlog accounting for corrupted GSO frames Sasha Levin
2020-01-16 17:21 ` [PATCH AUTOSEL 4.14 232/371] net/af_iucv: always register net_device notifier Sasha Levin
2020-01-16 17:21 ` [PATCH AUTOSEL 4.14 241/371] bnxt_en: Fix ethtool selftest crash under error conditions Sasha Levin
2020-01-16 17:21 ` [PATCH AUTOSEL 4.14 244/371] rxrpc: Fix uninitialized error code in rxrpc_send_data_packet() Sasha Levin
2020-01-16 17:21 ` [PATCH AUTOSEL 4.14 247/371] net: pasemi: fix an use-after-free in pasemi_mac_phy_init() Sasha Levin
2020-01-16 17:22 ` [PATCH AUTOSEL 4.14 251/371] libertas_tf: Use correct channel range in lbtf_geo_init Sasha Levin
2020-01-16 17:22 ` [PATCH AUTOSEL 4.14 252/371] qed: reduce maximum stack frame size Sasha Levin
2020-01-16 17:22 ` [PATCH AUTOSEL 4.14 258/371] tipc: reduce risk of wakeup queue starvation Sasha Levin
2020-01-16 17:22 ` [PATCH AUTOSEL 4.14 261/371] net/mlx5: Fix mlx5_ifc_query_lag_out_bits Sasha Levin
2020-01-16 17:22 ` [PATCH AUTOSEL 4.14 268/371] net/rds: Add a few missing rds_stat_names entries Sasha Levin
2020-01-16 17:22 ` [PATCH AUTOSEL 4.14 269/371] bnxt_en: Fix handling FRAG_ERR when NVM_INSTALL_UPDATE cmd fails Sasha Levin
2020-01-16 17:22 ` [PATCH AUTOSEL 4.14 273/371] mac80211: minstrel_ht: fix per-group max throughput rate initialization Sasha Levin
2020-01-16 17:22 ` [PATCH AUTOSEL 4.14 287/371] ath9k: dynack: fix possible deadlock in ath_dynack_node_{de}init Sasha Levin
2020-01-16 17:22 ` [PATCH AUTOSEL 4.14 289/371] net: sonic: return NETDEV_TX_OK if failed to map buffer Sasha Levin
2020-01-16 17:22 ` [PATCH AUTOSEL 4.14 295/371] ixgbe: sync the first fragment unconditionally Sasha Levin
2020-01-16 17:22 ` [PATCH AUTOSEL 4.14 297/371] net: sonic: replace dev_kfree_skb in sonic_send_packet Sasha Levin
2020-01-16 17:22 ` Sasha Levin [this message]
2020-01-16 17:22 ` [PATCH AUTOSEL 4.14 301/371] net/rds: Fix 'ib_evt_handler_call' element in 'rds_ib_stat_names' Sasha Levin
2020-01-16 17:22 ` [PATCH AUTOSEL 4.14 303/371] net: aquantia: Fix aq_vec_isr_legacy() return value Sasha Levin
2020-01-16 17:22 ` [PATCH AUTOSEL 4.14 304/371] net: hisilicon: Fix signedness bug in hix5hd2_dev_probe() Sasha Levin
2020-01-16 17:22 ` [PATCH AUTOSEL 4.14 305/371] net: broadcom/bcmsysport: Fix signedness in bcm_sysport_probe() Sasha Levin
2020-01-16 17:22 ` [PATCH AUTOSEL 4.14 306/371] net: stmmac: dwmac-meson8b: Fix signedness bug in probe Sasha Levin
2020-01-16 17:22 ` [PATCH AUTOSEL 4.14 307/371] net: axienet: fix a " Sasha Levin
2020-01-16 17:23 ` [PATCH AUTOSEL 4.14 308/371] of: mdio: Fix a signedness bug in of_phy_get_and_connect() Sasha Levin
2020-01-16 17:23 ` [PATCH AUTOSEL 4.14 309/371] net: ethernet: stmmac: Fix signedness bug in ipq806x_gmac_of_parse() Sasha Levin
2020-01-16 17:23 ` [PATCH AUTOSEL 4.14 310/371] ipv6: Handle race in addrconf_dad_work Sasha Levin
2020-01-16 17:23 ` [PATCH AUTOSEL 4.14 312/371] net: stmmac: gmac4+: Not all Unicast addresses may be available Sasha Levin
2020-01-16 17:23 ` [PATCH AUTOSEL 4.14 313/371] mac80211: accept deauth frames in IBSS mode Sasha Levin
2020-01-16 17:23 ` [PATCH AUTOSEL 4.14 314/371] llc: fix another potential sk_buff leak in llc_ui_sendmsg() Sasha Levin
2020-01-16 17:23 ` [PATCH AUTOSEL 4.14 315/371] llc: fix sk_buff refcounting in llc_conn_state_process() Sasha Levin
2020-01-16 17:23 ` [PATCH AUTOSEL 4.14 316/371] net: stmmac: fix length of PTP clock's name string Sasha Levin
2020-01-16 17:23 ` [PATCH AUTOSEL 4.14 317/371] act_mirred: Fix mirred_init_module error handling Sasha Levin
2020-01-16 17:23 ` [PATCH AUTOSEL 4.14 318/371] net: avoid possible false sharing in sk_leave_memory_pressure() Sasha Levin
2020-01-16 17:23 ` [PATCH AUTOSEL 4.14 319/371] net: add {READ|WRITE}_ONCE() annotations on ->rskq_accept_head Sasha Levin
2020-01-16 17:23 ` [PATCH AUTOSEL 4.14 320/371] tcp: annotate lockless access to tcp_memory_pressure Sasha Levin
2020-01-16 17:23 ` [PATCH AUTOSEL 4.14 324/371] net: netem: fix error path for corrupted GSO frames Sasha Levin
2020-01-16 17:23 ` [PATCH AUTOSEL 4.14 325/371] net: netem: correct the parent's backlog when corrupted packet was dropped Sasha Levin
2020-01-16 17:23 ` [PATCH AUTOSEL 4.14 326/371] net: qca_spi: Move reset_count to struct qcaspi Sasha Levin
2020-01-16 17:23 ` [PATCH AUTOSEL 4.14 329/371] mt7601u: fix bbp version check in mt7601u_wait_bbp_ready Sasha Levin
2020-01-16 17:23 ` [PATCH AUTOSEL 4.14 333/371] cw1200: Fix a signedness bug in cw1200_load_firmware() Sasha Levin
2020-01-16 17:23 ` [PATCH AUTOSEL 4.14 338/371] rtlwifi: Remove unnecessary NULL check in rtl_regd_init Sasha Levin
2020-01-16 17:23 ` [PATCH AUTOSEL 4.14 345/371] hv_netvsc: flag software created hash value Sasha Levin
2020-01-16 17:23 ` [PATCH AUTOSEL 4.14 346/371] net: neigh: use long type to store jiffies delta Sasha Levin
2020-01-16 17:23 ` [PATCH AUTOSEL 4.14 349/371] packet: fix data-race in fanout_flow_is_huge() Sasha Levin
2020-01-16 17:24 ` [PATCH AUTOSEL 4.14 368/371] tipc: fix wrong timeout input for tipc_wait_for_cond() Sasha Levin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200116172403.18149-242-sashal@kernel.org \
    --to=sashal@kernel.org \
    --cc=ath10k@lists.infradead.org \
    --cc=drinkcat@chromium.org \
    --cc=kvalo@codeaurora.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-wireless@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=stable@vger.kernel.org \
    --cc=wgong@codeaurora.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).