summaryrefslogtreecommitdiffstats
path: root/net/ipv4/ip_output.c
diff options
context:
space:
mode:
authorShmulik Ladkani <shmulik@metanetworks.com>2019-04-29 16:39:30 +0300
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2019-05-08 07:19:04 +0200
commitbcb37e6d310c458447b6ae2eccf045a1ceaa3698 (patch)
tree0d6f3abb42597def982c55124eff9ab1e7f26bef /net/ipv4/ip_output.c
parentb9daeb29a4c8c579de8dddf9036e14aed1663a99 (diff)
downloadlinux-stable-bcb37e6d310c458447b6ae2eccf045a1ceaa3698.tar.gz
linux-stable-bcb37e6d310c458447b6ae2eccf045a1ceaa3698.tar.bz2
linux-stable-bcb37e6d310c458447b6ae2eccf045a1ceaa3698.zip
ipv4: ip_do_fragment: Preserve skb_iif during fragmentation
[ Upstream commit d2f0c961148f65bc73eda72b9fa3a4e80973cb49 ] Previously, during fragmentation after forwarding, skb->skb_iif isn't preserved, i.e. 'ip_copy_metadata' does not copy skb_iif from given 'from' skb. As a result, ip_do_fragment's creates fragments with zero skb_iif, leading to inconsistent behavior. Assume for example an eBPF program attached at tc egress (post forwarding) that examines __sk_buff->ingress_ifindex: - the correct iif is observed if forwarding path does not involve fragmentation/refragmentation - a bogus iif is observed if forwarding path involves fragmentation/refragmentatiom Fix, by preserving skb_iif during 'ip_copy_metadata'. Signed-off-by: Shmulik Ladkani <shmulik.ladkani@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'net/ipv4/ip_output.c')
-rw-r--r--net/ipv4/ip_output.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
index 100c86f1f547..7f1a85c6a614 100644
--- a/net/ipv4/ip_output.c
+++ b/net/ipv4/ip_output.c
@@ -492,6 +492,7 @@ static void ip_copy_metadata(struct sk_buff *to, struct sk_buff *from)
to->pkt_type = from->pkt_type;
to->priority = from->priority;
to->protocol = from->protocol;
+ to->skb_iif = from->skb_iif;
skb_dst_drop(to);
skb_dst_copy(to, from);
to->dev = from->dev;