]> git.droids-corp.org - dpdk.git/commitdiff
net/ice: fix raw flow input pattern parsing
authorTing Xu <ting.xu@intel.com>
Mon, 18 Apr 2022 06:59:08 +0000 (14:59 +0800)
committerQi Zhang <qi.z.zhang@intel.com>
Mon, 18 Apr 2022 07:27:46 +0000 (09:27 +0200)
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>
Acked-by: Junfeng Guo <junfeng.guo@intel.com>
drivers/net/ice/ice_fdir_filter.c

index 0982478febf8696362b68a7aaa4419e9a78ca9b8..7914ba9407310c9fbcda4ca9ffa952c4d15a8bfb 100644 (file)
@@ -1870,10 +1870,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 tmp_val = 0;
                        uint8_t pkt_len = 0;
                        uint8_t tmp = 0;
@@ -1884,8 +1885,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')
@@ -1894,7 +1905,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')
@@ -1902,7 +1913,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')
@@ -1911,7 +1922,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')
@@ -1947,6 +1958,8 @@ ice_fdir_parse_pattern(__rte_unused struct ice_adapter *ad,
 
                        filter->parser_ena = true;
 
+                       rte_free(tmp_spec);
+                       rte_free(tmp_mask);
                        break;
                }