net: mana: Check if netdev/napi_alloc_frag returns single page

netdev/napi_alloc_frag() may fall back to single page which is smaller
than the requested size.
Add error checking to avoid memory overwritten.

Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Haiyang Zhang 2023-04-21 10:06:58 -07:00 committed by Jakub Kicinski
parent 5c74064f43
commit df18f2da30

View File

@ -553,6 +553,14 @@ static int mana_pre_alloc_rxbufs(struct mana_port_context *mpc, int new_mtu)
va = netdev_alloc_frag(mpc->rxbpre_alloc_size); va = netdev_alloc_frag(mpc->rxbpre_alloc_size);
if (!va) if (!va)
goto error; goto error;
page = virt_to_head_page(va);
/* Check if the frag falls back to single page */
if (compound_order(page) <
get_order(mpc->rxbpre_alloc_size)) {
put_page(page);
goto error;
}
} else { } else {
page = dev_alloc_page(); page = dev_alloc_page();
if (!page) if (!page)
@ -1504,6 +1512,13 @@ static void *mana_get_rxfrag(struct mana_rxq *rxq, struct device *dev,
if (!va) if (!va)
return NULL; return NULL;
page = virt_to_head_page(va);
/* Check if the frag falls back to single page */
if (compound_order(page) < get_order(rxq->alloc_size)) {
put_page(page);
return NULL;
}
} else { } else {
page = dev_alloc_page(); page = dev_alloc_page();
if (!page) if (!page)