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