From 16214ffbe80ef632013183ea5c2942184eda8ca3 Mon Sep 17 00:00:00 2001 From: Visweswara Tanuku Date: Fri, 14 Dec 2018 12:12:58 +0530 Subject: [PATCH] qcacld-3.0: Return error for invalid wow pattern qcacld-2.0 to qcacld-3.0 propagation Return error from driver whenever user sends invalid wow pattern via iwpriv command Change-Id: Iacf84986e95ed3f156fd588d5c855654c3541a89 CRs-Fixed: 2299629 --- core/hdd/src/wlan_hdd_wext.c | 6 ++++-- core/hdd/src/wlan_hdd_wowl.c | 20 +++++++++++++++----- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/core/hdd/src/wlan_hdd_wext.c b/core/hdd/src/wlan_hdd_wext.c index 9bccc3d7c891..417ca252ba6a 100644 --- a/core/hdd/src/wlan_hdd_wext.c +++ b/core/hdd/src/wlan_hdd_wext.c @@ -5523,11 +5523,13 @@ static int __iw_setchar_getnone(struct net_device *dev, switch (sub_cmd) { case WE_WOWL_ADD_PTRN: hdd_debug("ADD_PTRN"); - hdd_add_wowl_ptrn(adapter, str_arg); + if (!hdd_add_wowl_ptrn(adapter, str_arg)) + return -EINVAL; break; case WE_WOWL_DEL_PTRN: hdd_debug("DEL_PTRN"); - hdd_del_wowl_ptrn(adapter, str_arg); + if (!hdd_del_wowl_ptrn(adapter, str_arg)) + return -EINVAL; break; case WE_NEIGHBOR_REPORT_REQUEST: { diff --git a/core/hdd/src/wlan_hdd_wowl.c b/core/hdd/src/wlan_hdd_wowl.c index 379e0e9c0e83..afb2b9828564 100644 --- a/core/hdd/src/wlan_hdd_wowl.c +++ b/core/hdd/src/wlan_hdd_wowl.c @@ -107,6 +107,7 @@ bool hdd_add_wowl_ptrn(struct hdd_adapter *adapter, const char *ptrn) uint8_t sessionId = adapter->session_id; struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter); uint8_t num_filters; + bool invalid_ptrn = false; status = hdd_get_num_wow_filters(hdd_ctx, &num_filters); if (QDF_IS_STATUS_ERROR(status)) @@ -127,11 +128,13 @@ bool hdd_add_wowl_ptrn(struct hdd_adapter *adapter, const char *ptrn) continue; } - if (!memcmp(ptrn, g_hdd_wowl_ptrns[i], len)) { - hdd_err("WoWL pattern '%s' already configured", - g_hdd_wowl_ptrns[i]); - ptrn += len; - goto next_ptrn; + if (strlen(g_hdd_wowl_ptrns[i]) == len) { + if (!memcmp(ptrn, g_hdd_wowl_ptrns[i], len)) { + hdd_err("WoWL pattern '%s' already configured", + g_hdd_wowl_ptrns[i]); + ptrn += len; + goto next_ptrn; + } } } @@ -145,6 +148,7 @@ bool hdd_add_wowl_ptrn(struct hdd_adapter *adapter, const char *ptrn) if (ptrn[2] != WOWL_INTRA_PTRN_TOKENIZER || ptrn[5] != WOWL_INTRA_PTRN_TOKENIZER) { hdd_err("Malformed pattern string. Skip!"); + invalid_ptrn = true; ptrn += len; goto next_ptrn; } @@ -161,6 +165,7 @@ bool hdd_add_wowl_ptrn(struct hdd_adapter *adapter, const char *ptrn) || localPattern.pattern_mask_size > WOWL_PTRN_MASK_MAX_SIZE) { hdd_err("Invalid length specified. Skip!"); + invalid_ptrn = true; ptrn += len; goto next_ptrn; } @@ -170,6 +175,7 @@ bool hdd_add_wowl_ptrn(struct hdd_adapter *adapter, const char *ptrn) if ((offset >= len) || (ptrn[offset] != WOWL_INTRA_PTRN_TOKENIZER)) { hdd_err("Malformed pattern string..skip!"); + invalid_ptrn = true; ptrn += len; goto next_ptrn; } @@ -179,6 +185,7 @@ bool hdd_add_wowl_ptrn(struct hdd_adapter *adapter, const char *ptrn) if (offset + 1 != len) { /* offset begins with 0 */ hdd_err("Malformed pattern string...skip!"); + invalid_ptrn = true; ptrn += len; goto next_ptrn; } @@ -244,6 +251,9 @@ next_ptrn: } } + if (invalid_ptrn) + return false; + return true; }