aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksandr Loktionov <[email protected]>2021-04-22 10:19:23 +0000
committerTony Nguyen <[email protected]>2021-07-01 10:59:21 -0700
commit6c19d772618fea40d9681f259368f284a330fd90 (patch)
tree83bcdf19fef3bcd228e7acd1b1e5b5e0ae3df667
parentaf30cbd2f4d6d66a9b6094e0aa32420bc8b20e08 (diff)
igb: Check if num of q_vectors is smaller than max before array access
Ensure that the adapter->q_vector[MAX_Q_VECTORS] array isn't accessed beyond its size. It was fixed by using a local variable num_q_vectors as a limit for loop index, and ensure that num_q_vectors is not bigger than MAX_Q_VECTORS. Fixes: 047e0030f1e6 ("igb: add new data structure for handling interrupts and NAPI") Signed-off-by: Aleksandr Loktionov <[email protected]> Reviewed-by: Grzegorz Siwik <[email protected]> Reviewed-by: Arkadiusz Kubalewski <[email protected]> Reviewed-by: Slawomir Laba <[email protected]> Reviewed-by: Sylwester Dziedziuch <[email protected]> Reviewed-by: Mateusz Palczewski <[email protected]> Tested-by: Tony Brelinski <[email protected]> Signed-off-by: Tony Nguyen <[email protected]>
-rw-r--r--drivers/net/ethernet/intel/igb/igb_main.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
index abc239b736fb..9470ba891483 100644
--- a/drivers/net/ethernet/intel/igb/igb_main.c
+++ b/drivers/net/ethernet/intel/igb/igb_main.c
@@ -931,6 +931,7 @@ static void igb_configure_msix(struct igb_adapter *adapter)
**/
static int igb_request_msix(struct igb_adapter *adapter)
{
+ unsigned int num_q_vectors = adapter->num_q_vectors;
struct net_device *netdev = adapter->netdev;
int i, err = 0, vector = 0, free_vector = 0;
@@ -939,7 +940,13 @@ static int igb_request_msix(struct igb_adapter *adapter)
if (err)
goto err_out;
- for (i = 0; i < adapter->num_q_vectors; i++) {
+ if (num_q_vectors > MAX_Q_VECTORS) {
+ num_q_vectors = MAX_Q_VECTORS;
+ dev_warn(&adapter->pdev->dev,
+ "The number of queue vectors (%d) is higher than max allowed (%d)\n",
+ adapter->num_q_vectors, MAX_Q_VECTORS);
+ }
+ for (i = 0; i < num_q_vectors; i++) {
struct igb_q_vector *q_vector = adapter->q_vector[i];
vector++;