summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTiger Yu <tfyu@codeaurora.org>2017-12-06 13:43:46 +0800
committersnandini <snandini@codeaurora.org>2017-12-10 23:07:53 -0800
commitb34f6f3afe229e32a32418f75889279f6e00d157 (patch)
treebfb607316e07c2313753b17186df3c2a77c22bce
parentab4dad3134ee3bad75b085a1e5c73e3d9cb3d062 (diff)
qcacld-2.0: Fix potential buffer overflow in ol_rx_flush_handler
Check for the validity of tid when received the htt message of HTT_T2H_MSG_TYPE_RX_FLUSH & HTT_T2H_MSG_TYPE_RX_PN_IND from firmware to ensure the buffer overflow does not happen. And correct the sequence number type from signed int to unsigned. Change-Id: Ibff86e891c335bfe8c2f9db82410545036463ed3 CRs-Fixed: 2149399
-rw-r--r--CORE/CLD_TXRX/HTT/htt_t2h.c8
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_rx_defrag.c14
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_rx_defrag.h4
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_rx_reorder.c15
-rw-r--r--CORE/SERVICES/COMMON/ol_htt_rx_api.h4
-rw-r--r--CORE/SERVICES/COMMON/ol_txrx_htt_api.h4
6 files changed, 33 insertions, 16 deletions
diff --git a/CORE/CLD_TXRX/HTT/htt_t2h.c b/CORE/CLD_TXRX/HTT/htt_t2h.c
index acdf900adeb3..7f2b7290a6bf 100644
--- a/CORE/CLD_TXRX/HTT/htt_t2h.c
+++ b/CORE/CLD_TXRX/HTT/htt_t2h.c
@@ -178,7 +178,7 @@ htt_t2h_lp_msg_handler(void *context, adf_nbuf_t htt_t2h_msg )
{
u_int16_t peer_id;
u_int8_t tid;
- int seq_num_start, seq_num_end;
+ u_int16_t seq_num_start, seq_num_end;
enum htt_rx_flush_action action;
peer_id = HTT_RX_FLUSH_PEER_ID_GET(*msg_word);
@@ -760,7 +760,7 @@ if (adf_os_unlikely(pdev->rx_ring.rx_reset)) {
{
u_int16_t peer_id;
u_int8_t tid, pn_ie_cnt, *pn_ie=NULL;
- int seq_num_start, seq_num_end;
+ u_int16_t seq_num_start, seq_num_end;
/*First dword */
peer_id = HTT_RX_PN_IND_PEER_ID_GET(*msg_word);
@@ -1220,8 +1220,8 @@ void
htt_rx_frag_ind_flush_seq_num_range(
htt_pdev_handle pdev,
adf_nbuf_t rx_frag_ind_msg,
- int *seq_num_start,
- int *seq_num_end)
+ u_int16_t *seq_num_start,
+ u_int16_t *seq_num_end)
{
u_int32_t *msg_word;
diff --git a/CORE/CLD_TXRX/TXRX/ol_rx_defrag.c b/CORE/CLD_TXRX/TXRX/ol_rx_defrag.c
index 2504b17112ce..a51eb75b79ed 100644
--- a/CORE/CLD_TXRX/TXRX/ol_rx_defrag.c
+++ b/CORE/CLD_TXRX/TXRX/ol_rx_defrag.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2014, 2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2014, 2016-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -192,12 +192,20 @@ ol_rx_frag_indication_handler(
u_int8_t tid)
{
u_int16_t seq_num;
- int seq_num_start, seq_num_end;
+ u_int16_t seq_num_start, seq_num_end;
struct ol_txrx_peer_t *peer;
htt_pdev_handle htt_pdev;
adf_nbuf_t head_msdu, tail_msdu;
void *rx_mpdu_desc;
+ if (tid >= OL_TXRX_NUM_EXT_TIDS) {
+ TXRX_PRINT(TXRX_PRINT_LEVEL_ERR,
+ "%s: invalid tid, %u\n",
+ __FUNCTION__,
+ tid);
+ return;
+ }
+
htt_pdev = pdev->htt_pdev;
peer = ol_txrx_peer_find_by_id(pdev, peer_id);
@@ -245,7 +253,7 @@ ol_rx_reorder_flush_frag(
htt_pdev_handle htt_pdev,
struct ol_txrx_peer_t *peer,
unsigned tid,
- int seq_num)
+ u_int16_t seq_num)
{
struct ol_rx_reorder_array_elem_t *rx_reorder_array_elem;
int seq;
diff --git a/CORE/CLD_TXRX/TXRX/ol_rx_defrag.h b/CORE/CLD_TXRX/TXRX/ol_rx_defrag.h
index 737c29987305..7750f2456fd6 100644
--- a/CORE/CLD_TXRX/TXRX/ol_rx_defrag.h
+++ b/CORE/CLD_TXRX/TXRX/ol_rx_defrag.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2014 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2014, 2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -165,7 +165,7 @@ ol_rx_reorder_flush_frag(
htt_pdev_handle htt_pdev,
struct ol_txrx_peer_t *peer,
unsigned tid,
- int seq_num);
+ u_int16_t seq_num);
static inline void
xor_block(
diff --git a/CORE/CLD_TXRX/TXRX/ol_rx_reorder.c b/CORE/CLD_TXRX/TXRX/ol_rx_reorder.c
index 80901be5ad97..c7bffde0e460 100644
--- a/CORE/CLD_TXRX/TXRX/ol_rx_reorder.c
+++ b/CORE/CLD_TXRX/TXRX/ol_rx_reorder.c
@@ -638,6 +638,14 @@ ol_rx_flush_handler(
struct ol_rx_reorder_array_elem_t *rx_reorder_array_elem;
htt_pdev_handle htt_pdev = pdev->htt_pdev;
+ if (tid >= OL_TXRX_NUM_EXT_TIDS) {
+ TXRX_PRINT(TXRX_PRINT_LEVEL_ERR,
+ "%s: invalid tid, %u\n",
+ __FUNCTION__,
+ tid);
+ return;
+ }
+
peer = ol_txrx_peer_find_by_id(pdev, peer_id);
if (peer) {
vdev = peer->vdev;
@@ -681,8 +689,8 @@ ol_rx_pn_ind_handler(
ol_txrx_pdev_handle pdev,
u_int16_t peer_id,
u_int8_t tid,
- int seq_num_start,
- int seq_num_end,
+ u_int16_t seq_num_start,
+ u_int16_t seq_num_end,
u_int8_t pn_ie_cnt,
u_int8_t *pn_ie)
{
@@ -694,7 +702,8 @@ ol_rx_pn_ind_handler(
adf_nbuf_t head_msdu = NULL;
adf_nbuf_t tail_msdu = NULL;
htt_pdev_handle htt_pdev = pdev->htt_pdev;
- int seq_num, i=0;
+ u_int16_t seq_num;
+ int i=0;
peer = ol_txrx_peer_find_by_id(pdev, peer_id);
diff --git a/CORE/SERVICES/COMMON/ol_htt_rx_api.h b/CORE/SERVICES/COMMON/ol_htt_rx_api.h
index 3ac1aff57577..6073731a6cc8 100644
--- a/CORE/SERVICES/COMMON/ol_htt_rx_api.h
+++ b/CORE/SERVICES/COMMON/ol_htt_rx_api.h
@@ -849,8 +849,8 @@ void
htt_rx_frag_ind_flush_seq_num_range(
htt_pdev_handle pdev,
adf_nbuf_t rx_frag_ind_msg,
- int *seq_num_start,
- int *seq_num_end);
+ u_int16_t *seq_num_start,
+ u_int16_t *seq_num_end);
/**
* @brief Return the HL rx desc size
* @param pdev - the HTT instance the rx data was received on
diff --git a/CORE/SERVICES/COMMON/ol_txrx_htt_api.h b/CORE/SERVICES/COMMON/ol_txrx_htt_api.h
index 6918a6d5ca1c..516b3873d14f 100644
--- a/CORE/SERVICES/COMMON/ol_txrx_htt_api.h
+++ b/CORE/SERVICES/COMMON/ol_txrx_htt_api.h
@@ -670,8 +670,8 @@ ol_rx_pn_ind_handler(
ol_txrx_pdev_handle pdev,
u_int16_t peer_id,
u_int8_t tid,
- int seq_num_start,
- int seq_num_end,
+ u_int16_t seq_num_start,
+ u_int16_t seq_num_end,
u_int8_t pn_ie_cnt,
u_int8_t *pn_ie);