]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/net/ethernet/sfc/siena_sriov.c
sfc: Correct validation of peer_page_count in efx_vfdi_set_status_page()
[karo-tx-linux.git] / drivers / net / ethernet / sfc / siena_sriov.c
index 5c6839ec3a83233a3b005f9c6ba8dd1a08495dea..80976e84eee6119d9da5aab034ab414a59567fb0 100644 (file)
@@ -796,12 +796,13 @@ static int efx_vfdi_set_status_page(struct efx_vf *vf)
 {
        struct efx_nic *efx = vf->efx;
        struct vfdi_req *req = vf->buf.addr;
-       unsigned int page_count;
+       u64 page_count = req->u.set_status_page.peer_page_count;
+       u64 max_page_count =
+               (EFX_PAGE_SIZE -
+                offsetof(struct vfdi_req, u.set_status_page.peer_page_addr[0]))
+               / sizeof(req->u.set_status_page.peer_page_addr[0]);
 
-       page_count = req->u.set_status_page.peer_page_count;
-       if (!req->u.set_status_page.dma_addr || EFX_PAGE_SIZE <
-           offsetof(struct vfdi_req,
-                    u.set_status_page.peer_page_addr[page_count])) {
+       if (!req->u.set_status_page.dma_addr || page_count > max_page_count) {
                if (net_ratelimit())
                        netif_err(efx, hw, efx->net_dev,
                                  "ERROR: Invalid SET_STATUS_PAGE from %s\n",