Patch "bpf: pull before calling skb_postpull_rcsum()" has been added to the 5.10-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    bpf: pull before calling skb_postpull_rcsum()

to the 5.10-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     bpf-pull-before-calling-skb_postpull_rcsum.patch
and it can be found in the queue-5.10 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 4f6827171291d128efd7c11c395dd9c39ebbd3ab
Author: Jakub Kicinski <kuba@xxxxxxxxxx>
Date:   Mon Dec 19 16:47:00 2022 -0800

    bpf: pull before calling skb_postpull_rcsum()
    
    [ Upstream commit 54c3f1a81421f85e60ae2eaae7be3727a09916ee ]
    
    Anand hit a BUG() when pulling off headers on egress to a SW tunnel.
    We get to skb_checksum_help() with an invalid checksum offset
    (commit d7ea0d9df2a6 ("net: remove two BUG() from skb_checksum_help()")
    converted those BUGs to WARN_ONs()).
    He points out oddness in how skb_postpull_rcsum() gets used.
    Indeed looks like we should pull before "postpull", otherwise
    the CHECKSUM_PARTIAL fixup from skb_postpull_rcsum() will not
    be able to do its job:
    
            if (skb->ip_summed == CHECKSUM_PARTIAL &&
                skb_checksum_start_offset(skb) < 0)
                    skb->ip_summed = CHECKSUM_NONE;
    
    Reported-by: Anand Parthasarathy <anpartha@xxxxxxxx>
    Fixes: 6578171a7ff0 ("bpf: add bpf_skb_change_proto helper")
    Signed-off-by: Jakub Kicinski <kuba@xxxxxxxxxx>
    Acked-by: Stanislav Fomichev <sdf@xxxxxxxxxx>
    Link: https://lore.kernel.org/r/20221220004701.402165-1-kuba@xxxxxxxxxx
    Signed-off-by: Martin KaFai Lau <martin.lau@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/net/core/filter.c b/net/core/filter.c
index e3cdbd4996e0..a5df0cf46bbf 100644
--- a/net/core/filter.c
+++ b/net/core/filter.c
@@ -3201,15 +3201,18 @@ static int bpf_skb_generic_push(struct sk_buff *skb, u32 off, u32 len)
 
 static int bpf_skb_generic_pop(struct sk_buff *skb, u32 off, u32 len)
 {
+	void *old_data;
+
 	/* skb_ensure_writable() is not needed here, as we're
 	 * already working on an uncloned skb.
 	 */
 	if (unlikely(!pskb_may_pull(skb, off + len)))
 		return -ENOMEM;
 
-	skb_postpull_rcsum(skb, skb->data + off, len);
-	memmove(skb->data + len, skb->data, off);
+	old_data = skb->data;
 	__skb_pull(skb, len);
+	skb_postpull_rcsum(skb, old_data + off, len);
+	memmove(skb->data, old_data, off);
 
 	return 0;
 }



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux