Florian Westphal
b0e56e3c56
netfilter: nat: can't use dst_hold on noref dst
[ Upstream commit 542fbda0f0 ]
The dst entry might already have a zero refcount, waiting on rcu list
to be free'd. Using dst_hold() transitions its reference count to 1, and
next dst release will try to free it again -- resulting in a double free:
WARNING: CPU: 1 PID: 0 at include/net/dst.h:239 nf_xfrm_me_harder+0xe7/0x130 [nf_nat]
RIP: 0010:nf_xfrm_me_harder+0xe7/0x130 [nf_nat]
Code: 48 8b 5c 24 60 65 48 33 1c 25 28 00 00 00 75 53 48 83 c4 68 5b 5d 41 5c c3 85 c0 74 0d 8d 48 01 f0 0f b1 0a 74 86 85 c0 75 f3 <0f> 0b e9 7b ff ff ff 29 c6 31 d2 b9 20 00 48 00 4c 89 e7 e8 31 27
Call Trace:
nf_nat_ipv4_out+0x78/0x90 [nf_nat_ipv4]
nf_hook_slow+0x36/0xd0
ip_output+0x9f/0xd0
ip_forward+0x328/0x440
ip_rcv+0x8a/0xb0
Use dst_hold_safe instead and bail out if we cannot take a reference.
Fixes: a4c2fd7f78 ("net: remove DST_NOCACHE flag")
Reported-by: Martin Zaharinov <micron10@gmail.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2019-01-13 10:00:58 +01:00
..
2019-01-13 10:00:58 +01:00
2018-12-17 09:28:51 +01:00
2017-09-08 18:55:52 +02:00
2017-11-02 11:10:55 +01:00
2018-11-21 09:24:09 +01:00
2017-09-04 13:25:19 +02:00
2017-09-04 13:25:19 +02:00
2018-08-24 13:08:57 +02:00
2018-09-15 09:45:28 +02:00
2018-08-24 13:09:22 +02:00
2017-09-04 13:25:18 +02:00
2017-09-04 13:25:18 +02:00
2017-09-04 13:25:18 +02:00
2017-09-04 13:25:18 +02:00
2017-09-04 13:25:18 +02:00
2019-01-13 10:00:57 +01:00
2017-09-04 13:25:19 +02:00
2017-11-02 11:10:55 +01:00
2018-08-24 13:09:07 +02:00
2019-01-13 10:00:58 +01:00
2018-03-15 10:54:23 +01:00
2017-09-04 13:25:19 +02:00
2017-08-28 17:44:00 +02:00
2017-11-02 11:10:55 +01:00
2018-12-17 09:28:52 +01:00
2018-07-08 15:30:50 +02:00
2018-09-15 09:45:28 +02:00
2018-01-31 14:03:41 +01:00
2018-07-17 11:39:32 +02:00
2018-12-17 09:28:48 +01:00
2017-09-04 13:25:09 +02:00
2018-06-16 09:45:14 +02:00
2017-08-28 17:42:56 +02:00
2018-07-08 15:30:49 +02:00
2018-07-08 15:30:51 +02:00
2018-07-08 15:30:49 +02:00
2017-09-04 13:25:09 +02:00
2017-08-28 17:42:56 +02:00
2017-09-04 13:25:09 +02:00
2017-08-28 18:14:30 +02:00
2018-09-05 09:26:27 +02:00
2018-04-26 11:02:21 +02:00
2018-02-25 11:08:01 +01:00
2018-02-25 11:07:50 +01:00
2018-10-10 08:54:23 +02:00
2019-01-09 17:14:51 +01:00
2018-12-17 09:28:49 +01:00
2018-11-27 16:10:48 +01:00
2018-04-26 11:02:13 +02:00
2018-04-26 11:02:13 +02:00
2017-09-04 13:25:19 +02:00
2017-09-04 13:25:19 +02:00
2018-04-26 11:02:13 +02:00
2018-01-31 14:03:41 +01:00
2018-02-25 11:07:50 +01:00
2018-04-08 14:26:29 +02:00
2017-11-02 11:10:55 +01:00
2017-09-26 20:04:34 +02:00
2018-04-26 11:02:13 +02:00
2017-09-03 17:08:42 -07:00