From: Avinash Dayanand <[email protected]>

The condition 'tc < adapter->num_tc' only gates the destination-port
check for in-range TCs; when tc is out of range (tc >= num_tc) the if
body is skipped entirely and the function falls through to
VIRTCHNL_ACTION_TC_REDIRECT and returns 0, silently steering traffic to
a non-existent traffic class instead of rejecting the request.

Simply flipping the comparison to 'tc > adapter->num_tc' does not fix
this: it would let every in-range, non-zero tc (tc <= num_tc) skip the
destination-port requirement entirely, while an out-of-range tc with a
destination port set would still fall through and return 0.

Fix this by explicitly rejecting tc >= adapter->num_tc with -EINVAL,
and only then requiring a destination port for the remaining in-range,
non-zero TCs.

Fixes: 0075fa0fadd0 ("i40evf: Add support to apply cloud filters")
Cc: [email protected]
Signed-off-by: Avinash Dayanand <[email protected]>
Signed-off-by: Aleksandr Loktionov <[email protected]>
---
 drivers/net/ethernet/intel/iavf/iavf_main.c | 15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)

diff --git a/drivers/net/ethernet/intel/iavf/iavf_main.c 
b/drivers/net/ethernet/intel/iavf/iavf_main.c
index 29b8403..deb03f2 100644
--- a/drivers/net/ethernet/intel/iavf/iavf_main.c
+++ b/drivers/net/ethernet/intel/iavf/iavf_main.c
@@ -4047,12 +4047,15 @@ static int iavf_handle_tclass(struct iavf_adapter 
*adapter, u32 tc,
 {
        if (tc == 0)
                return 0;
-       if (tc < adapter->num_tc) {
-               if (!filter->f.data.tcp_spec.dst_port) {
-                       dev_err(&adapter->pdev->dev,
-                               "Specify destination port to redirect to 
traffic class other than TC0\n");
-                       return -EINVAL;
-               }
+       if (tc >= adapter->num_tc) {
+               dev_err(&adapter->pdev->dev,
+                       "Unable to add filter because of invalid destination 
traffic class\n");
+               return -EINVAL;
+       }
+       if (!filter->f.data.tcp_spec.dst_port) {
+               dev_err(&adapter->pdev->dev,
+                       "Specify destination port to redirect to traffic class 
other than TC0\n");
+               return -EINVAL;
        }
        /* redirect to a traffic class on the same device */
        filter->f.action = VIRTCHNL_ACTION_TC_REDIRECT;
-- 
2.52.0

Reply via email to