mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2026-04-29 12:28:27 +02:00
i40e: fix src IP mask checks and memcpy argument names in cloud filter
[ Upstream commite809085f49] 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:e284fc2804("i40e: Add and delete cloud filter") Signed-off-by: Alok Tiwari <alok.a.tiwari@oracle.com> Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com> Reviewed-by: Paul Menzel <pmenzel@molgen.mpg.de> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
843e913cef
commit
5f205d2d64
@@ -3821,10 +3821,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;
|
||||
@@ -3879,7 +3879,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)
|
||||
@@ -3967,10 +3967,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;
|
||||
|
||||
Reference in New Issue
Block a user