i40evf: don't overflow buffer
authorMitch Williams <mitch.a.williams@intel.com>
Mon, 16 May 2016 17:26:36 +0000 (10:26 -0700)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Mon, 27 Jun 2016 22:31:50 +0000 (15:31 -0700)
If the user adds an obscene amount of MAC addresses, the driver will run
into the situation where it has too many address requests to fit into a
single PF message. The driver checks for this case, and calculates the
maximum number of messages that it can send. Then it completely ignores
this count and overflows the buffer.

Fix this by checking the address count and bailing out of the loop at
the appropriate time.

Change-ID: If8dcbb04602c75941dc0cd8309065e1de9ca791c
Signed-off-by: Mitch Williams <mitch.a.williams@intel.com>
Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/i40evf/i40evf_virtchnl.c

index f13445691507c2b7ea668f402cbb04e6f65cf38c..d76c221d4c8a3ab7f2e5fe386962842b91d8ae2c 100644 (file)
@@ -434,6 +434,8 @@ void i40evf_add_ether_addrs(struct i40evf_adapter *adapter)
                        ether_addr_copy(veal->list[i].addr, f->macaddr);
                        i++;
                        f->add = false;
+                       if (i == count)
+                               break;
                }
        }
        if (!more)
@@ -497,6 +499,8 @@ void i40evf_del_ether_addrs(struct i40evf_adapter *adapter)
                        i++;
                        list_del(&f->list);
                        kfree(f);
+                       if (i == count)
+                               break;
                }
        }
        if (!more)
@@ -560,6 +564,8 @@ void i40evf_add_vlans(struct i40evf_adapter *adapter)
                        vvfl->vlan_id[i] = f->vlan;
                        i++;
                        f->add = false;
+                       if (i == count)
+                               break;
                }
        }
        if (!more)
@@ -623,6 +629,8 @@ void i40evf_del_vlans(struct i40evf_adapter *adapter)
                        i++;
                        list_del(&f->list);
                        kfree(f);
+                       if (i == count)
+                               break;
                }
        }
        if (!more)