Skip to content

Commit 817c7cd

Browse files
edumazetdavem330
authored andcommitted
gve: fix frag_list chaining
gve_rx_append_frags() is able to build skbs chained with frag_list, like GRO engine. Problem is that shinfo->frag_list should only be used for the head of the chain. All other links should use skb->next pointer. Otherwise, built skbs are not valid and can cause crashes. Equivalent code in GRO (skb_gro_receive()) is: if (NAPI_GRO_CB(p)->last == p) skb_shinfo(p)->frag_list = skb; else NAPI_GRO_CB(p)->last->next = skb; NAPI_GRO_CB(p)->last = skb; Fixes: 9b8dd5e ("gve: DQO: Add RX path") Signed-off-by: Eric Dumazet <edumazet@google.com> Cc: Bailey Forrest <bcf@google.com> Cc: Willem de Bruijn <willemb@google.com> Cc: Catherine Sullivan <csully@google.com> Reviewed-by: David Ahern <dsahern@kernel.org> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 915d975 commit 817c7cd

File tree

1 file changed

+4
-1
lines changed

1 file changed

+4
-1
lines changed

drivers/net/ethernet/google/gve/gve_rx_dqo.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -570,7 +570,10 @@ static int gve_rx_append_frags(struct napi_struct *napi,
570570
if (!skb)
571571
return -1;
572572

573-
skb_shinfo(rx->ctx.skb_tail)->frag_list = skb;
573+
if (rx->ctx.skb_tail == rx->ctx.skb_head)
574+
skb_shinfo(rx->ctx.skb_head)->frag_list = skb;
575+
else
576+
rx->ctx.skb_tail->next = skb;
574577
rx->ctx.skb_tail = skb;
575578
num_frags = 0;
576579
}

0 commit comments

Comments
 (0)