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