|
|
eb2ff5 |
From b83b0767eccfb386406ccb24130b975f1c2b0ee4 Mon Sep 17 00:00:00 2001
|
|
|
eb2ff5 |
From: Phil Sutter <psutter@redhat.com>
|
|
|
eb2ff5 |
Date: Thu, 21 Feb 2019 14:39:47 +0100
|
|
|
eb2ff5 |
Subject: [PATCH] ip-route: Fix nexthop encap parsing
|
|
|
eb2ff5 |
|
|
|
eb2ff5 |
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1624656
|
|
|
eb2ff5 |
Upstream Status: iproute2.git commit 05d978e0850a6
|
|
|
eb2ff5 |
Conflicts: Some chunks dropped due to missing support for
|
|
|
eb2ff5 |
ident-type and hook-type.
|
|
|
eb2ff5 |
|
|
|
eb2ff5 |
commit 05d978e0850a6a3bae1e6c5392d82f7b1496f86a
|
|
|
eb2ff5 |
Author: Phil Sutter <phil@nwl.cc>
|
|
|
eb2ff5 |
Date: Tue Nov 13 13:39:04 2018 +0100
|
|
|
eb2ff5 |
|
|
|
eb2ff5 |
ip-route: Fix nexthop encap parsing
|
|
|
eb2ff5 |
|
|
|
eb2ff5 |
When parsing nexthop parameters, a buffer of 4k bytes is provided. Yet,
|
|
|
eb2ff5 |
in lwt_parse_encap() and some functions called by it, buffer size was
|
|
|
eb2ff5 |
assumed to be 1k despite the actual size was provided. This led to
|
|
|
eb2ff5 |
spurious buffer size errors if the buffer was filled by previous nexthop
|
|
|
eb2ff5 |
parameters to exceed that 1k boundary.
|
|
|
eb2ff5 |
|
|
|
eb2ff5 |
Fixes: 1e5293056a02c ("lwtunnel: Add encapsulation support to ip route")
|
|
|
eb2ff5 |
Fixes: 5866bddd9aa9e ("ila: Add support for ILA lwtunnels")
|
|
|
eb2ff5 |
Fixes: ed67f83806538 ("ila: Support for checksum neutral translation")
|
|
|
eb2ff5 |
Fixes: 86905c8f057c0 ("ila: support for configuring identifier and hook types")
|
|
|
eb2ff5 |
Fixes: b15f440e78373 ("lwt: BPF support for LWT")
|
|
|
eb2ff5 |
Signed-off-by: Phil Sutter <phil@nwl.cc>
|
|
|
eb2ff5 |
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
|
|
|
eb2ff5 |
---
|
|
|
eb2ff5 |
ip/iproute_lwtunnel.c | 10 +++++-----
|
|
|
eb2ff5 |
1 file changed, 5 insertions(+), 5 deletions(-)
|
|
|
eb2ff5 |
|
|
|
eb2ff5 |
diff --git a/ip/iproute_lwtunnel.c b/ip/iproute_lwtunnel.c
|
|
|
eb2ff5 |
index 1a68912..b6f08f0 100644
|
|
|
eb2ff5 |
--- a/ip/iproute_lwtunnel.c
|
|
|
eb2ff5 |
+++ b/ip/iproute_lwtunnel.c
|
|
|
eb2ff5 |
@@ -343,7 +343,7 @@ static int parse_encap_ila(struct rtattr *rta, size_t len,
|
|
|
eb2ff5 |
|
|
|
eb2ff5 |
argc--; argv++;
|
|
|
eb2ff5 |
|
|
|
eb2ff5 |
- if (rta_addattr64(rta, 1024, ILA_ATTR_LOCATOR, locator))
|
|
|
eb2ff5 |
+ if (rta_addattr64(rta, len, ILA_ATTR_LOCATOR, locator))
|
|
|
eb2ff5 |
return -1;
|
|
|
eb2ff5 |
|
|
|
eb2ff5 |
while (argc > 0) {
|
|
|
eb2ff5 |
@@ -357,7 +357,7 @@ static int parse_encap_ila(struct rtattr *rta, size_t len,
|
|
|
eb2ff5 |
invarg("\"csum-mode\" value is invalid\n",
|
|
|
eb2ff5 |
*argv);
|
|
|
eb2ff5 |
|
|
|
eb2ff5 |
- ret = rta_addattr8(rta, 1024, ILA_ATTR_CSUM_MODE,
|
|
|
eb2ff5 |
+ ret = rta_addattr8(rta, len, ILA_ATTR_CSUM_MODE,
|
|
|
eb2ff5 |
(__u8)csum_mode);
|
|
|
eb2ff5 |
|
|
|
eb2ff5 |
argc--; argv++;
|
|
|
eb2ff5 |
@@ -528,7 +528,7 @@ static int parse_encap_bpf(struct rtattr *rta, size_t len, int *argcp,
|
|
|
eb2ff5 |
if (get_unsigned(&headroom, *argv, 0) || headroom == 0)
|
|
|
eb2ff5 |
invarg("headroom is invalid\n", *argv);
|
|
|
eb2ff5 |
if (!headroom_set)
|
|
|
eb2ff5 |
- rta_addattr32(rta, 1024, LWT_BPF_XMIT_HEADROOM,
|
|
|
eb2ff5 |
+ rta_addattr32(rta, len, LWT_BPF_XMIT_HEADROOM,
|
|
|
eb2ff5 |
headroom);
|
|
|
eb2ff5 |
headroom_set = 1;
|
|
|
eb2ff5 |
} else if (strcmp(*argv, "help") == 0) {
|
|
|
eb2ff5 |
@@ -569,7 +569,7 @@ int lwt_parse_encap(struct rtattr *rta, size_t len, int *argcp, char ***argvp)
|
|
|
eb2ff5 |
exit(-1);
|
|
|
eb2ff5 |
}
|
|
|
eb2ff5 |
|
|
|
eb2ff5 |
- nest = rta_nest(rta, 1024, RTA_ENCAP);
|
|
|
eb2ff5 |
+ nest = rta_nest(rta, len, RTA_ENCAP);
|
|
|
eb2ff5 |
switch (type) {
|
|
|
eb2ff5 |
case LWTUNNEL_ENCAP_MPLS:
|
|
|
eb2ff5 |
ret = parse_encap_mpls(rta, len, &argc, &argv);
|
|
|
eb2ff5 |
@@ -596,7 +596,7 @@ int lwt_parse_encap(struct rtattr *rta, size_t len, int *argcp, char ***argvp)
|
|
|
eb2ff5 |
|
|
|
eb2ff5 |
rta_nest_end(rta, nest);
|
|
|
eb2ff5 |
|
|
|
eb2ff5 |
- ret = rta_addattr16(rta, 1024, RTA_ENCAP_TYPE, type);
|
|
|
eb2ff5 |
+ ret = rta_addattr16(rta, len, RTA_ENCAP_TYPE, type);
|
|
|
eb2ff5 |
|
|
|
eb2ff5 |
*argcp = argc;
|
|
|
eb2ff5 |
*argvp = argv;
|
|
|
eb2ff5 |
--
|
|
|
eb2ff5 |
1.8.3.1
|
|
|
eb2ff5 |
|