summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSubash Abhinov Kasiviswanathan <subashab@codeaurora.org>2019-11-23 00:13:46 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2019-11-22 23:23:07 -0800
commit7fa0fbc4c4b5344b5c4b9ca7851502f475573fed (patch)
tree66b7621633e7cefaf2914636bdded53a5d0a7885
parent1df496e828e2c6b9f0f810132f0e1121002ffd1a (diff)
downloaddata-kernel-7fa0fbc4c4b5344b5c4b9ca7851502f475573fed.tar.gz
drivers: shs: limit size copied to cached flows array to avoid globar var corruption
Add limit to the number of flows copied into the gold flow and slow start flow arrays before memcpy to shared memory. Going out of bounds on the array write corrupted the global variables for the shared memory pointers. Fixes the following: [ 846.803490] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000081 [ 846.909206] Process kworker/4:1 (pid: 80, stack limit = 0xffffff800b670000) [ 846.916377] CPU: 4 PID: 80 Comm: kworker/4:1 Tainted: G S O 4.19.81+ #1 [ 846.930899] Workqueue: rmnet_shs_wq rmnet_shs_wq_process_wq [rmnet_shs] [ 846.942612] pc : rmnet_shs_wq_mem_update_cached_sorted_ss_flows+0x9c/0xf0 [rmnet_shs] [ 846.950657] lr : rmnet_shs_wq_eval_cpus_caps_and_flows+0x74/0x218 [rmnet_shs] Change-Id: Ifeee71e48fc61c4dd750eb061573beb88fcd2b7d Signed-off-by: Subash Abhinov Kasiviswanathan <subashab@codeaurora.org>
-rw-r--r--drivers/rmnet/shs/rmnet_shs_wq_mem.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/drivers/rmnet/shs/rmnet_shs_wq_mem.c b/drivers/rmnet/shs/rmnet_shs_wq_mem.c
index bec0da5..e80d424 100644
--- a/drivers/rmnet/shs/rmnet_shs_wq_mem.c
+++ b/drivers/rmnet/shs/rmnet_shs_wq_mem.c
@@ -490,6 +490,14 @@ void rmnet_shs_wq_mem_update_cached_sorted_gold_flows(struct list_head *gold_flo
if (!gflow_node)
continue;
+ if (gflow_node->rx_pps == 0) {
+ continue;
+ }
+
+ if (idx >= RMNET_SHS_MAX_USRFLOWS) {
+ break;
+ }
+
rm_err("SHS_SGOLD: > flow 0x%x with pps %llu on cpu[%d]",
gflow_node->hash, gflow_node->rx_pps,
gflow_node->cpu_num);
@@ -548,6 +556,15 @@ void rmnet_shs_wq_mem_update_cached_sorted_ss_flows(struct list_head *ss_flows)
if (!ssflow_node)
continue;
+
+ if (ssflow_node->rx_pps == 0) {
+ continue;
+ }
+
+ if (idx >= RMNET_SHS_MAX_USRFLOWS) {
+ break;
+ }
+
rm_err("SHS_SLOW: > flow 0x%x with pps %llu on cpu[%d]",
ssflow_node->hash, ssflow_node->rx_pps,
ssflow_node->cpu_num);