linux/net/sched
Paolo Abeni abe35bf3be net/sched: act_pedit: really ensure the skb is writable
[ Upstream commit 8b796475fd ]

Currently pedit tries to ensure that the accessed skb offset
is writable via skb_unclone(). The action potentially allows
touching any skb bytes, so it may end-up modifying shared data.

The above causes some sporadic MPTCP self-test failures, due to
this code:

	tc -n $ns2 filter add dev ns2eth$i egress \
		protocol ip prio 1000 \
		handle 42 fw \
		action pedit munge offset 148 u8 invert \
		pipe csum tcp \
		index 100

The above modifies a data byte outside the skb head and the skb is
a cloned one, carrying a TCP output packet.

This change addresses the issue by keeping track of a rough
over-estimate highest skb offset accessed by the action and ensuring
such offset is really writable.

Note that this may cause performance regressions in some scenarios,
but hopefully pedit is not in the critical path.

Fixes: db2c24175d ("act_pedit: access skb->data safely")
Acked-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Tested-by: Geliang Tang <geliang.tang@suse.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Acked-by: Jamal Hadi Salim <jhs@mojatatu.com>
Link: https://lore.kernel.org/r/1fcf78e6679d0a287dd61bb0f04730ce33b3255d.1652194627.git.pabeni@redhat.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2022-05-18 10:23:44 +02:00
..
act_api.c net: sched: limit TC_ACT_REPEAT loops 2022-02-23 12:01:07 +01:00
act_bpf.c net_sched: defer tcf_idr_insert() in tcf_action_init_1() 2020-09-24 19:46:21 -07:00
act_connmark.c net_sched: defer tcf_idr_insert() in tcf_action_init_1() 2020-09-24 19:46:21 -07:00
act_csum.c net_sched: defer tcf_idr_insert() in tcf_action_init_1() 2020-09-24 19:46:21 -07:00
act_ct.c net/sched: act_ct: Fix flow table lookup after ct clear or switching zones 2022-03-02 11:42:50 +01:00
act_ctinfo.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2020-10-05 18:40:01 -07:00
act_gact.c net_sched: defer tcf_idr_insert() in tcf_action_init_1() 2020-09-24 19:46:21 -07:00
act_gate.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2020-10-05 18:40:01 -07:00
act_ife.c net_sched: defer tcf_idr_insert() in tcf_action_init_1() 2020-09-24 19:46:21 -07:00
act_ipt.c net_sched: defer tcf_idr_insert() in tcf_action_init_1() 2020-09-24 19:46:21 -07:00
act_meta_mark.c
act_meta_skbprio.c
act_meta_skbtcindex.c
act_mirred.c net: sched: act_mirred: drop dst for the direction from egress to ingress 2021-11-26 10:39:16 +01:00
act_mpls.c net/sched: act_mpls: ensure LSE is pullable before reading it 2020-12-03 11:13:37 -08:00
act_nat.c net_sched: defer tcf_idr_insert() in tcf_action_init_1() 2020-09-24 19:46:21 -07:00
act_pedit.c net/sched: act_pedit: really ensure the skb is writable 2022-05-18 10:23:44 +02:00
act_police.c net_sched: defer tcf_idr_insert() in tcf_action_init_1() 2020-09-24 19:46:21 -07:00
act_sample.c net_sched: defer tcf_idr_insert() in tcf_action_init_1() 2020-09-24 19:46:21 -07:00
act_simple.c net_sched: defer tcf_idr_insert() in tcf_action_init_1() 2020-09-24 19:46:21 -07:00
act_skbedit.c net_sched: defer tcf_idr_insert() in tcf_action_init_1() 2020-09-24 19:46:21 -07:00
act_skbmod.c net/sched: act_skbmod: Skip non-Ethernet packets 2021-07-28 14:35:40 +02:00
act_tunnel_key.c net/sched: act_tunnel_key: fix OOB write in case of IPv6 ERSPAN tunnels 2020-10-20 21:10:41 -07:00
act_vlan.c net/sched: act_vlan: Fix modify to allow 0 2021-07-14 16:56:19 +02:00
cls_api.c net/sched: fix initialization order when updating chain 0 head 2022-04-20 09:23:12 +02:00
cls_basic.c
cls_bpf.c
cls_cgroup.c
cls_flow.c
cls_flower.c net/sched: flower: fix parsing of ethertype following VLAN header 2022-04-20 09:23:11 +02:00
cls_fw.c
cls_matchall.c
cls_route.c
cls_rsvp.c
cls_rsvp.h
cls_rsvp6.c
cls_tcindex.c net: sched: fix memory leak in tcindex_partial_destroy_work 2021-07-28 14:35:38 +02:00
cls_u32.c net/sched: cls_u32: fix possible leak in u32_init_knode() 2022-04-27 13:53:50 +02:00
em_canid.c
em_cmp.c
em_ipset.c
em_ipt.c
em_meta.c
em_nbyte.c
em_text.c
em_u32.c
ematch.c
Kconfig net: sched: incorrect Kconfig dependencies on Netfilter modules 2021-02-23 15:53:23 +01:00
Makefile
sch_api.c net_sched: add __rcu annotation to netdev->qdisc 2022-02-23 12:01:02 +01:00
sch_atm.c
sch_blackhole.c
sch_cake.c sch_cake: do not call cake_destroy() from cake_init() 2021-12-22 09:30:53 +01:00
sch_cbq.c net: sched: Fix qdisc_rate_table refcount leak when get tcf_block failed 2021-09-15 09:50:45 +02:00
sch_cbs.c
sch_choke.c net: sched: validate stab values 2021-03-30 14:31:57 +02:00
sch_codel.c
sch_drr.c
sch_dsmark.c sch_dsmark: fix a NULL deref in qdisc_reset() 2021-06-03 09:00:50 +02:00
sch_etf.c
sch_ets.c net/sched: sch_ets: don't remove idle classes from the round-robin list 2021-12-22 09:30:54 +01:00
sch_fifo.c net_sched: fix NULL deref in fifo_set_limit() 2021-10-13 10:04:26 +02:00
sch_fq_codel.c fq_codel: reject silly quantum parameters 2021-09-22 12:28:05 +02:00
sch_fq_pie.c net/sched: fq_pie: prevent dismantle issue 2021-12-14 11:32:37 +01:00
sch_fq.c
sch_generic.c net_sched: add __rcu annotation to netdev->qdisc 2022-02-23 12:01:02 +01:00
sch_gred.c net: sched: validate stab values 2021-03-30 14:31:57 +02:00
sch_hfsc.c
sch_hhf.c
sch_htb.c
sch_ingress.c
sch_mq.c net: sched: update default qdisc visibility after Tx queue cnt changes 2021-11-18 14:03:53 +01:00
sch_mqprio.c net: sched: update default qdisc visibility after Tx queue cnt changes 2021-11-18 14:03:53 +01:00
sch_multiq.c
sch_netem.c netem: fix zero division in tabledist 2020-10-29 11:45:47 -07:00
sch_pie.c
sch_plug.c
sch_prio.c
sch_qfq.c sch_qfq: prevent shift-out-of-bounds in qfq_init_qdisc 2022-01-11 15:25:00 +01:00
sch_red.c net: sched: validate stab values 2021-03-30 14:31:57 +02:00
sch_sfb.c
sch_sfq.c net: sched: validate stab values 2021-03-30 14:31:57 +02:00
sch_skbprio.c
sch_taprio.c net/sched: taprio: Check if socket flags are valid 2022-04-20 09:23:13 +02:00
sch_tbf.c
sch_teql.c net: sched: sch_teql: fix null-pointer dereference 2021-04-14 08:42:02 +02:00