[v2] net/ice: fix raw flow input pattern value change in FDIR

Message ID 20220328014926.20809-1-ting.xu@intel.com (mailing list archive)
State Superseded, archived
Delegated to: Qi Zhang
Headers
Series [v2] net/ice: fix raw flow input pattern value change in FDIR |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/iol-mellanox-Performance success Performance Testing PASS
ci/iol-intel-Performance success Performance Testing PASS
ci/github-robot: build success github build: passed
ci/iol-intel-Functional success Functional Testing PASS
ci/iol-abi-testing success Testing PASS
ci/iol-x86_64-compile-testing success Testing PASS
ci/iol-aarch64-compile-testing success Testing PASS
ci/iol-aarch64-unit-testing success Testing PASS
ci/iol-x86_64-unit-testing success Testing PASS
ci/Intel-compilation success Compilation OK
ci/intel-Testing success Testing PASS

Commit Message

Xu, Ting March 28, 2022, 1:49 a.m. UTC
  When parsing raw flow pattern in FDIR, the input parameter spec and
mask are used directly and the original value will be changed. It
will cause error if these values are used in other functions. In this
patch, temporary variables are created to store the spec and mask.

Fixes: 25be39cc1760 ("net/ice: enable protocol agnostic flow offloading in FDIR")

Cc: stable@dpdk.org

Signed-off-by: Ting Xu <ting.xu@intel.com>
---
 drivers/net/ice/ice_fdir_filter.c | 25 +++++++++++++++++++------
 1 file changed, 19 insertions(+), 6 deletions(-)
  

Comments

Junfeng Guo April 14, 2022, 1:27 a.m. UTC | #1
> -----Original Message-----
> From: Xu, Ting <ting.xu@intel.com>
> Sent: Monday, March 28, 2022 09:49
> To: dev@dpdk.org
> Cc: Guo, Junfeng <junfeng.guo@intel.com>; Xu, Ting
> <ting.xu@intel.com>; stable@dpdk.org; Yang, Qiming
> <qiming.yang@intel.com>; Zhang, Qi Z <qi.z.zhang@intel.com>
> Subject: [PATCH v2] net/ice: fix raw flow input pattern value change in
> FDIR
> 
> When parsing raw flow pattern in FDIR, the input parameter spec and
> mask are used directly and the original value will be changed. It
> will cause error if these values are used in other functions. In this
> patch, temporary variables are created to store the spec and mask.
> 
> Fixes: 25be39cc1760 ("net/ice: enable protocol agnostic flow offloading
> in FDIR")
> 
> Cc: stable@dpdk.org
> 
> Signed-off-by: Ting Xu <ting.xu@intel.com>
> ---
>  drivers/net/ice/ice_fdir_filter.c | 25 +++++++++++++++++++------
>  1 file changed, 19 insertions(+), 6 deletions(-)
> 
> --
> 2.17.1

Acked-by: Junfeng Guo <junfeng.guo@intel.com>

Regards,
Junfeng Guo
  

Patch

diff --git a/drivers/net/ice/ice_fdir_filter.c b/drivers/net/ice/ice_fdir_filter.c
index 7954c6d8ea..5ff1afac90 100644
--- a/drivers/net/ice/ice_fdir_filter.c
+++ b/drivers/net/ice/ice_fdir_filter.c
@@ -1868,10 +1868,11 @@  ice_fdir_parse_pattern(__rte_unused struct ice_adapter *ad,
 				break;
 
 			/* convert raw spec & mask from byte string to int */
-			unsigned char *tmp_spec =
+			unsigned char *spec_pattern =
 				(uint8_t *)(uintptr_t)raw_spec->pattern;
-			unsigned char *tmp_mask =
+			unsigned char *mask_pattern =
 				(uint8_t *)(uintptr_t)raw_mask->pattern;
+			uint8_t *tmp_spec, *tmp_mask;
 			uint16_t udp_port = 0;
 			uint16_t tmp_val = 0;
 			uint8_t pkt_len = 0;
@@ -1883,8 +1884,18 @@  ice_fdir_parse_pattern(__rte_unused struct ice_adapter *ad,
 				pkt_len)
 				return -rte_errno;
 
+			tmp_spec = rte_zmalloc(NULL, pkt_len / 2, 0);
+			if (!tmp_spec)
+				return -rte_errno;
+
+			tmp_mask = rte_zmalloc(NULL, pkt_len / 2, 0);
+			if (!tmp_mask) {
+				rte_free(tmp_spec);
+				return -rte_errno;
+			}
+
 			for (i = 0, j = 0; i < pkt_len; i += 2, j++) {
-				tmp = tmp_spec[i];
+				tmp = spec_pattern[i];
 				if (tmp >= 'a' && tmp <= 'f')
 					tmp_val = tmp - 'a' + 10;
 				if (tmp >= 'A' && tmp <= 'F')
@@ -1893,7 +1904,7 @@  ice_fdir_parse_pattern(__rte_unused struct ice_adapter *ad,
 					tmp_val = tmp - '0';
 
 				tmp_val *= 16;
-				tmp = tmp_spec[i + 1];
+				tmp = spec_pattern[i + 1];
 				if (tmp >= 'a' && tmp <= 'f')
 					tmp_spec[j] = tmp_val + tmp - 'a' + 10;
 				if (tmp >= 'A' && tmp <= 'F')
@@ -1901,7 +1912,7 @@  ice_fdir_parse_pattern(__rte_unused struct ice_adapter *ad,
 				if (tmp >= '0' && tmp <= '9')
 					tmp_spec[j] = tmp_val + tmp - '0';
 
-				tmp = tmp_mask[i];
+				tmp = mask_pattern[i];
 				if (tmp >= 'a' && tmp <= 'f')
 					tmp_val = tmp - 'a' + 10;
 				if (tmp >= 'A' && tmp <= 'F')
@@ -1910,7 +1921,7 @@  ice_fdir_parse_pattern(__rte_unused struct ice_adapter *ad,
 					tmp_val = tmp - '0';
 
 				tmp_val *= 16;
-				tmp = tmp_mask[i + 1];
+				tmp = mask_pattern[i + 1];
 				if (tmp >= 'a' && tmp <= 'f')
 					tmp_mask[j] = tmp_val + tmp - 'a' + 10;
 				if (tmp >= 'A' && tmp <= 'F')
@@ -1953,6 +1964,8 @@  ice_fdir_parse_pattern(__rte_unused struct ice_adapter *ad,
 
 			filter->parser_ena = true;
 
+			rte_free(tmp_spec);
+			rte_free(tmp_mask);
 			break;
 		}