]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - releases/4.14.112/openvswitch-fix-flow-actions-reallocation.patch
Linux 4.14.112
[thirdparty/kernel/stable-queue.git] / releases / 4.14.112 / openvswitch-fix-flow-actions-reallocation.patch
CommitLineData
9354405a
GKH
1From foo@baz Mon Apr 15 07:47:06 CEST 2019
2From: Andrea Righi <andrea.righi@canonical.com>
3Date: Thu, 28 Mar 2019 07:36:00 +0100
4Subject: openvswitch: fix flow actions reallocation
5
6From: Andrea Righi <andrea.righi@canonical.com>
7
8[ Upstream commit f28cd2af22a0c134e4aa1c64a70f70d815d473fb ]
9
10The flow action buffer can be resized if it's not big enough to contain
11all the requested flow actions. However, this resize doesn't take into
12account the new requested size, the buffer is only increased by a factor
13of 2x. This might be not enough to contain the new data, causing a
14buffer overflow, for example:
15
16[ 42.044472] =============================================================================
17[ 42.045608] BUG kmalloc-96 (Not tainted): Redzone overwritten
18[ 42.046415] -----------------------------------------------------------------------------
19
20[ 42.047715] Disabling lock debugging due to kernel taint
21[ 42.047716] INFO: 0x8bf2c4a5-0x720c0928. First byte 0x0 instead of 0xcc
22[ 42.048677] INFO: Slab 0xbc6d2040 objects=29 used=18 fp=0xdc07dec4 flags=0x2808101
23[ 42.049743] INFO: Object 0xd53a3464 @offset=2528 fp=0xccdcdebb
24
25[ 42.050747] Redzone 76f1b237: cc cc cc cc cc cc cc cc ........
26[ 42.051839] Object d53a3464: 6b 6b 6b 6b 6b 6b 6b 6b 0c 00 00 00 6c 00 00 00 kkkkkkkk....l...
27[ 42.053015] Object f49a30cc: 6c 00 0c 00 00 00 00 00 00 00 00 03 78 a3 15 f6 l...........x...
28[ 42.054203] Object acfe4220: 20 00 02 00 ff ff ff ff 00 00 00 00 00 00 00 00 ...............
29[ 42.055370] Object 21024e91: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
30[ 42.056541] Object 070e04c3: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
31[ 42.057797] Object 948a777a: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
32[ 42.059061] Redzone 8bf2c4a5: 00 00 00 00 ....
33[ 42.060189] Padding a681b46e: 5a 5a 5a 5a 5a 5a 5a 5a ZZZZZZZZ
34
35Fix by making sure the new buffer is properly resized to contain all the
36requested data.
37
38BugLink: https://bugs.launchpad.net/bugs/1813244
39Signed-off-by: Andrea Righi <andrea.righi@canonical.com>
40Acked-by: Pravin B Shelar <pshelar@ovn.org>
41Signed-off-by: David S. Miller <davem@davemloft.net>
42Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
43---
44 net/openvswitch/flow_netlink.c | 4 ++--
45 1 file changed, 2 insertions(+), 2 deletions(-)
46
47--- a/net/openvswitch/flow_netlink.c
48+++ b/net/openvswitch/flow_netlink.c
49@@ -1967,14 +1967,14 @@ static struct nlattr *reserve_sfa_size(s
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) {