diff options
-rw-r--r-- | build/external/patches/dpdk_22.03/0001-net-ice-fix-raw-flow-input-pattern-value-change-i.patch | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/build/external/patches/dpdk_22.03/0001-net-ice-fix-raw-flow-input-pattern-value-change-i.patch b/build/external/patches/dpdk_22.03/0001-net-ice-fix-raw-flow-input-pattern-value-change-i.patch new file mode 100644 index 00000000000..755f5bc27dd --- /dev/null +++ b/build/external/patches/dpdk_22.03/0001-net-ice-fix-raw-flow-input-pattern-value-change-i.patch @@ -0,0 +1,96 @@ +From 794d99b8abeeb401a374489a9e3c629d023c271f Mon Sep 17 00:00:00 2001 +From: Ting Xu <ting.xu@intel.com> +Date: Fri, 4 Mar 2022 07:26:28 +0000 +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(-) + +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; + } + +-- +2.17.1 + |