FAILED: patch "[PATCH] octeon_ep_vf: add NULL check for napi_build_skb()" failed to apply to 7.0-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 7.0-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-7.0.y
git checkout FETCH_HEAD
git cherry-pick -x dd66b42854705e4e4ee7f14d260f86c578bed3e3
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026050148-renounce-robin-688e@gregkh' --subject-prefix 'PATCH 7.0.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From dd66b42854705e4e4ee7f14d260f86c578bed3e3 Mon Sep 17 00:00:00 2001
From: David Carlier <[email protected]>
Date: Thu, 9 Apr 2026 19:40:09 +0100
Subject: [PATCH] octeon_ep_vf: add NULL check for napi_build_skb()
napi_build_skb() can return NULL on allocation failure. In __octep_vf_oq_process_rx(), the result is used directly without a NULL check in both the single-buffer and multi-fragment paths, leading to a NULL pointer dereference.
Add NULL checks after both napi_build_skb() calls, properly advancing descriptors and consuming remaining fragments on failure.
drivers/net/ethernet/marvell/octeon_ep_vf/octep_vf_rx.c +28 -2
@@ -414,10 +414,15 @@ static int __octep_vf_oq_process_rx(struct octep_vf_device *oct, data_offset =OCTEP_VF_OQ_RESP_HW_SIZE ; rx_ol_flags =0 ; } - rx_bytes += buff_info->len; -if (buff_info->len <= oq->max_single_buffer_size) { skb =napi_build_skb ((void *)resp_hw,PAGE_SIZE ); +if (!skb) { + oq->stats->alloc_failures++; + desc_used++; + read_idx =octep_vf_oq_next_idx (oq, read_idx); +continue ; + } + rx_bytes += buff_info->len;skb_reserve (skb, data_offset);skb_put (skb, buff_info->len); desc_used++;
@@ -427,6 +432,27 @@ static int __octep_vf_oq_process_rx(struct octep_vf_device *oct,u16 data_len; skb =napi_build_skb ((void *)resp_hw,PAGE_SIZE ); +if (!skb) { + oq->stats->alloc_failures++; + desc_used++; + read_idx =octep_vf_oq_next_idx (oq, read_idx); + data_len = buff_info->len - oq->max_single_buffer_size; +while (data_len) { +dma_unmap_page (oq->dev, oq->desc_ring[read_idx].buffer_ptr, +PAGE_SIZE ,DMA_FROM_DEVICE ); + buff_info = (struct octep_vf_rx_buffer *) + &oq->buff_info[read_idx]; + buff_info->page =NULL ; +if (data_len < oq->buffer_size) + data_len =0 ; +else + data_len -= oq->buffer_size; + desc_used++; + read_idx =octep_vf_oq_next_idx (oq, read_idx); + } +continue ; + } + rx_bytes += buff_info->len;skb_reserve (skb, data_offset);/* Head fragment includes response header(s); * subsequent fragments contains only data.
Sasha Levin
maintainerPATCH 1/1 octeon_ep_vf: add NULL check for napi_build_skb()
From: David Carlier <[email protected]>
[ Upstream commit dd66b42854705e4e4ee7f14d260f86c578bed3e3 ]
napi_build_skb() can return NULL on allocation failure. In __octep_vf_oq_process_rx(), the result is used directly without a NULL check in both the single-buffer and multi-fragment paths, leading to a NULL pointer dereference.
Add NULL checks after both napi_build_skb() calls, properly advancing descriptors and consuming remaining fragments on failure.
--- .../marvell/octeon_ep_vf/octep_vf_rx.c | 36 +++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-)
drivers/net/ethernet/marvell/octeon_ep_vf/octep_vf_rx.c +34 -2
@@ -409,10 +409,17 @@ static int __octep_vf_oq_process_rx(struct octep_vf_device *oct, data_offset =OCTEP_VF_OQ_RESP_HW_SIZE ; rx_ol_flags =0 ; } - rx_bytes += buff_info->len; -if (buff_info->len <= oq->max_single_buffer_size) { skb =napi_build_skb ((void *)resp_hw,PAGE_SIZE ); +if (!skb) { + oq->stats->alloc_failures++; + desc_used++; + read_idx++; +if (read_idx == oq->max_count) + read_idx =0 ; +continue ; + } + rx_bytes += buff_info->len;skb_reserve (skb, data_offset);skb_put (skb, buff_info->len); read_idx++;
@@ -424,6 +431,31 @@ static int __octep_vf_oq_process_rx(struct octep_vf_device *oct,u16 data_len; skb =napi_build_skb ((void *)resp_hw,PAGE_SIZE ); +if (!skb) { + oq->stats->alloc_failures++; + desc_used++; + read_idx++; +if (read_idx == oq->max_count) + read_idx =0 ; + data_len = buff_info->len - oq->max_single_buffer_size; +while (data_len) { +dma_unmap_page (oq->dev, oq->desc_ring[read_idx].buffer_ptr, +PAGE_SIZE ,DMA_FROM_DEVICE ); + buff_info = (struct octep_vf_rx_buffer *) + &oq->buff_info[read_idx]; + buff_info->page =NULL ; +if (data_len < oq->buffer_size) + data_len =0 ; +else + data_len -= oq->buffer_size; + desc_used++; + read_idx++; +if (read_idx == oq->max_count) + read_idx =0 ; + } +continue ; + } + rx_bytes += buff_info->len;skb_reserve (skb, data_offset);/* Head fragment includes response header(s); * subsequent fragments contains only data.
Signature · 1 line
2.53.0