Fix following issues in the IPv4 and IPv6 cloud filter handling logic in
both the add and delete paths:

- The source-IP mask check incorrectly compares mask.src_ip[0] against
  tcf.dst_ip[0]. Update it to compare against tcf.src_ip[0]. This likely
  goes unnoticed because the check is in an "else if" path that only
  executes when dst_ip is not set, most cloud filter use cases focus on
  destination-IP matching, and the buggy condition can accidentally
  evaluate true in some cases.

- memcpy() for the IPv4 source address incorrectly uses
  ARRAY_SIZE(tcf.dst_ip) instead of ARRAY_SIZE(tcf.src_ip), although
  both arrays are the same size.

- The IPv4 memcpy operations used ARRAY_SIZE(tcf.dst_ip) and ARRAY_SIZE
  (tcf.src_ip), Update these to use sizeof(cfilter->ip.v4.dst_ip) and
  sizeof(cfilter->ip.v4.src_ip) to ensure correct and explicit copy size.

- In the IPv6 delete path, memcmp() uses sizeof(src_ip6) when comparing
  dst_ip6 fields. Replace this with sizeof(dst_ip6) to make the intent
  explicit, even though both fields are struct in6_addr.

Fixes: e284fc280473 ("i40e: Add and delete cloud filter")
Signed-off-by: Alok Tiwari <[email protected]>
Reviewed-by: Aleksandr Loktionov <[email protected]>
Reviewed-by: Paul Menzel <[email protected]>
---
v1 -> v2
update patch subject line and replace ARRAY_SIZE with sizeof
as suggested by Alex and added Reviewed-by Alex and Paul.
---
 drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c 
b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
index 081a4526a2f0..dd9fb170d98b 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
@@ -3818,10 +3818,10 @@ static int i40e_vc_del_cloud_filter(struct i40e_vf *vf, 
u8 *msg)
                cfilter.n_proto = ETH_P_IP;
                if (mask.dst_ip[0] & tcf.dst_ip[0])
                        memcpy(&cfilter.ip.v4.dst_ip, tcf.dst_ip,
-                              ARRAY_SIZE(tcf.dst_ip));
-               else if (mask.src_ip[0] & tcf.dst_ip[0])
+                              sizeof(cfilter.ip.v4.dst_ip));
+               else if (mask.src_ip[0] & tcf.src_ip[0])
                        memcpy(&cfilter.ip.v4.src_ip, tcf.src_ip,
-                              ARRAY_SIZE(tcf.dst_ip));
+                              sizeof(cfilter.ip.v4.src_ip));
                break;
        case VIRTCHNL_TCP_V6_FLOW:
                cfilter.n_proto = ETH_P_IPV6;
@@ -3876,7 +3876,7 @@ static int i40e_vc_del_cloud_filter(struct i40e_vf *vf, 
u8 *msg)
                /* for ipv6, mask is set for all sixteen bytes (4 words) */
                if (cfilter.n_proto == ETH_P_IPV6 && mask.dst_ip[3])
                        if (memcmp(&cfilter.ip.v6.dst_ip6, &cf->ip.v6.dst_ip6,
-                                  sizeof(cfilter.ip.v6.src_ip6)))
+                                  sizeof(cfilter.ip.v6.dst_ip6)))
                                continue;
                if (mask.vlan_id)
                        if (cfilter.vlan_id != cf->vlan_id)
@@ -3964,10 +3964,10 @@ static int i40e_vc_add_cloud_filter(struct i40e_vf *vf, 
u8 *msg)
                cfilter->n_proto = ETH_P_IP;
                if (mask.dst_ip[0] & tcf.dst_ip[0])
                        memcpy(&cfilter->ip.v4.dst_ip, tcf.dst_ip,
-                              ARRAY_SIZE(tcf.dst_ip));
-               else if (mask.src_ip[0] & tcf.dst_ip[0])
+                              sizeof(cfilter->ip.v4.dst_ip));
+               else if (mask.src_ip[0] & tcf.src_ip[0])
                        memcpy(&cfilter->ip.v4.src_ip, tcf.src_ip,
-                              ARRAY_SIZE(tcf.dst_ip));
+                              sizeof(cfilter->ip.v4.src_ip));
                break;
        case VIRTCHNL_TCP_V6_FLOW:
                cfilter->n_proto = ETH_P_IPV6;
-- 
2.50.1

Reply via email to