]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - releases/4.19.35/openvswitch-fix-flow-actions-reallocation.patch
Linux 4.19.35
[thirdparty/kernel/stable-queue.git] / releases / 4.19.35 / openvswitch-fix-flow-actions-reallocation.patch
CommitLineData
a9fba688
SL
1From 14051a86b37caa6112d12b69391cdd4aea9bf3f8 Mon Sep 17 00:00:00 2001
2From: Andrea Righi <andrea.righi@canonical.com>
3Date: Thu, 28 Mar 2019 07:36:00 +0100
4Subject: openvswitch: fix flow actions reallocation
5
6[ Upstream commit f28cd2af22a0c134e4aa1c64a70f70d815d473fb ]
7
8The flow action buffer can be resized if it's not big enough to contain
9all the requested flow actions. However, this resize doesn't take into
10account the new requested size, the buffer is only increased by a factor
11of 2x. This might be not enough to contain the new data, causing a
12buffer overflow, for example:
13
14[ 42.044472] =============================================================================
15[ 42.045608] BUG kmalloc-96 (Not tainted): Redzone overwritten
16[ 42.046415] -----------------------------------------------------------------------------
17
18[ 42.047715] Disabling lock debugging due to kernel taint
19[ 42.047716] INFO: 0x8bf2c4a5-0x720c0928. First byte 0x0 instead of 0xcc
20[ 42.048677] INFO: Slab 0xbc6d2040 objects=29 used=18 fp=0xdc07dec4 flags=0x2808101
21[ 42.049743] INFO: Object 0xd53a3464 @offset=2528 fp=0xccdcdebb
22
23[ 42.050747] Redzone 76f1b237: cc cc cc cc cc cc cc cc ........
24[ 42.051839] Object d53a3464: 6b 6b 6b 6b 6b 6b 6b 6b 0c 00 00 00 6c 00 00 00 kkkkkkkk....l...
25[ 42.053015] Object f49a30cc: 6c 00 0c 00 00 00 00 00 00 00 00 03 78 a3 15 f6 l...........x...
26[ 42.054203] Object acfe4220: 20 00 02 00 ff ff ff ff 00 00 00 00 00 00 00 00 ...............
27[ 42.055370] Object 21024e91: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
28[ 42.056541] Object 070e04c3: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
29[ 42.057797] Object 948a777a: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
30[ 42.059061] Redzone 8bf2c4a5: 00 00 00 00 ....
31[ 42.060189] Padding a681b46e: 5a 5a 5a 5a 5a 5a 5a 5a ZZZZZZZZ
32
33Fix by making sure the new buffer is properly resized to contain all the
34requested data.
35
36BugLink: https://bugs.launchpad.net/bugs/1813244
37Signed-off-by: Andrea Righi <andrea.righi@canonical.com>
38Acked-by: Pravin B Shelar <pshelar@ovn.org>
39Signed-off-by: David S. Miller <davem@davemloft.net>
40Signed-off-by: Sasha Levin <sashal@kernel.org>
41---
42 net/openvswitch/flow_netlink.c | 4 ++--
43 1 file changed, 2 insertions(+), 2 deletions(-)
44
45diff --git a/net/openvswitch/flow_netlink.c b/net/openvswitch/flow_netlink.c
46index c7b6010b2c09..eab5e8eaddaa 100644
47--- a/net/openvswitch/flow_netlink.c
48+++ b/net/openvswitch/flow_netlink.c
49@@ -2306,14 +2306,14 @@ static struct nlattr *reserve_sfa_size(struct sw_flow_actions **sfa,
50
51 struct sw_flow_actions *acts;
52 int new_acts_size;
53- int req_size = NLA_ALIGN(attr_len);
54+ size_t req_size = NLA_ALIGN(attr_len);
55 int next_offset = offsetof(struct sw_flow_actions, actions) +
56 (*sfa)->actions_len;
57
58 if (req_size <= (ksize(*sfa) - next_offset))
59 goto out;
60
61- new_acts_size = ksize(*sfa) * 2;
62+ new_acts_size = max(next_offset + req_size, ksize(*sfa) * 2);
63
64 if (new_acts_size > MAX_ACTIONS_BUFSIZE) {
65 if ((MAX_ACTIONS_BUFSIZE - next_offset) < req_size) {
66--
672.19.1
68