|
@@ -0,0 +1,178 @@
|
|
|
|
|
+From ac547ad027e3d4e283202ecb487cf54707234491 Mon Sep 17 00:00:00 2001
|
|
|
|
|
+From: Stephen Hemminger <[email protected]>
|
|
|
|
|
+Date: Thu, 12 Dec 2024 14:15:59 -0800
|
|
|
|
|
+Subject: [PATCH] flower: replace XATTR_SIZE_MAX
|
|
|
|
|
+
|
|
|
|
|
+The flower tc parser was using XATTR_SIZE_MAX from linux/limits.h,
|
|
|
|
|
+but this constant is intended to before extended filesystem attributes
|
|
|
|
|
+not for TC. Replace it with a local define.
|
|
|
|
|
+
|
|
|
|
|
+This fixes issue on systems with musl and XATTR_SIZE_MAX is not
|
|
|
|
|
+defined in limits.h there.
|
|
|
|
|
+
|
|
|
|
|
+Signed-off-by: Stephen Hemminger <[email protected]>
|
|
|
|
|
+---
|
|
|
|
|
+ tc/f_flower.c | 37 ++++++++++++++++++++-----------------
|
|
|
|
|
+ 1 file changed, 20 insertions(+), 17 deletions(-)
|
|
|
|
|
+
|
|
|
|
|
+--- a/tc/f_flower.c
|
|
|
|
|
++++ b/tc/f_flower.c
|
|
|
|
|
+@@ -10,7 +10,7 @@
|
|
|
|
|
+ #include <unistd.h>
|
|
|
|
|
+ #include <string.h>
|
|
|
|
|
+ #include <net/if.h>
|
|
|
|
|
+-#include <linux/limits.h>
|
|
|
|
|
++
|
|
|
|
|
+ #include <linux/if_arp.h>
|
|
|
|
|
+ #include <linux/if_ether.h>
|
|
|
|
|
+ #include <linux/ip.h>
|
|
|
|
|
+@@ -22,6 +22,9 @@
|
|
|
|
|
+ #include "tc_util.h"
|
|
|
|
|
+ #include "rt_names.h"
|
|
|
|
|
+
|
|
|
|
|
++/* maximum length of options string */
|
|
|
|
|
++#define FLOWER_OPTS_MAX 4096
|
|
|
|
|
++
|
|
|
|
|
+ #ifndef IPPROTO_L2TP
|
|
|
|
|
+ #define IPPROTO_L2TP 115
|
|
|
|
|
+ #endif
|
|
|
|
|
+@@ -1252,7 +1255,7 @@ static int flower_check_enc_opt_key(char
|
|
|
|
|
+
|
|
|
|
|
+ static int flower_parse_enc_opts_geneve(char *str, struct nlmsghdr *n)
|
|
|
|
|
+ {
|
|
|
|
|
+- char key[XATTR_SIZE_MAX], mask[XATTR_SIZE_MAX];
|
|
|
|
|
++ char key[FLOWER_OPTS_MAX], mask[FLOWER_OPTS_MAX];
|
|
|
|
|
+ int data_len, key_len, mask_len, err;
|
|
|
|
|
+ char *token, *slash;
|
|
|
|
|
+ struct rtattr *nest;
|
|
|
|
|
+@@ -1265,7 +1268,7 @@ static int flower_parse_enc_opts_geneve(
|
|
|
|
|
+ if (slash)
|
|
|
|
|
+ *slash = '\0';
|
|
|
|
|
+
|
|
|
|
|
+- if ((key_len + strlen(token) > XATTR_SIZE_MAX) ||
|
|
|
|
|
++ if ((key_len + strlen(token) > FLOWER_OPTS_MAX) ||
|
|
|
|
|
+ flower_check_enc_opt_key(token))
|
|
|
|
|
+ return -1;
|
|
|
|
|
+
|
|
|
|
|
+@@ -1275,7 +1278,7 @@ static int flower_parse_enc_opts_geneve(
|
|
|
|
|
+
|
|
|
|
|
+ if (!slash) {
|
|
|
|
|
+ /* Pad out mask when not provided */
|
|
|
|
|
+- if (mask_len + strlen(token) > XATTR_SIZE_MAX)
|
|
|
|
|
++ if (mask_len + strlen(token) > FLOWER_OPTS_MAX)
|
|
|
|
|
+ return -1;
|
|
|
|
|
+
|
|
|
|
|
+ data_len = strlen(rindex(token, ':'));
|
|
|
|
|
+@@ -1288,7 +1291,7 @@ static int flower_parse_enc_opts_geneve(
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+- if (mask_len + strlen(slash + 1) > XATTR_SIZE_MAX)
|
|
|
|
|
++ if (mask_len + strlen(slash + 1) > FLOWER_OPTS_MAX)
|
|
|
|
|
+ return -1;
|
|
|
|
|
+
|
|
|
|
|
+ strcpy(&mask[mask_len], slash + 1);
|
|
|
|
|
+@@ -1318,7 +1321,7 @@ static int flower_parse_enc_opts_geneve(
|
|
|
|
|
+
|
|
|
|
|
+ static int flower_parse_enc_opts_vxlan(char *str, struct nlmsghdr *n)
|
|
|
|
|
+ {
|
|
|
|
|
+- char key[XATTR_SIZE_MAX], mask[XATTR_SIZE_MAX];
|
|
|
|
|
++ char key[FLOWER_OPTS_MAX], mask[FLOWER_OPTS_MAX];
|
|
|
|
|
+ struct rtattr *nest;
|
|
|
|
|
+ char *slash;
|
|
|
|
|
+ int err;
|
|
|
|
|
+@@ -1326,14 +1329,14 @@ static int flower_parse_enc_opts_vxlan(c
|
|
|
|
|
+ slash = strchr(str, '/');
|
|
|
|
|
+ if (slash) {
|
|
|
|
|
+ *slash++ = '\0';
|
|
|
|
|
+- if (strlen(slash) > XATTR_SIZE_MAX)
|
|
|
|
|
++ if (strlen(slash) > FLOWER_OPTS_MAX)
|
|
|
|
|
+ return -1;
|
|
|
|
|
+ strcpy(mask, slash);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ strcpy(mask, "0xffffffff");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+- if (strlen(str) > XATTR_SIZE_MAX)
|
|
|
|
|
++ if (strlen(str) > FLOWER_OPTS_MAX)
|
|
|
|
|
+ return -1;
|
|
|
|
|
+ strcpy(key, str);
|
|
|
|
|
+
|
|
|
|
|
+@@ -1355,7 +1358,7 @@ static int flower_parse_enc_opts_vxlan(c
|
|
|
|
|
+
|
|
|
|
|
+ static int flower_parse_enc_opts_erspan(char *str, struct nlmsghdr *n)
|
|
|
|
|
+ {
|
|
|
|
|
+- char key[XATTR_SIZE_MAX], mask[XATTR_SIZE_MAX];
|
|
|
|
|
++ char key[FLOWER_OPTS_MAX], mask[FLOWER_OPTS_MAX];
|
|
|
|
|
+ struct rtattr *nest;
|
|
|
|
|
+ char *slash;
|
|
|
|
|
+ int err;
|
|
|
|
|
+@@ -1364,7 +1367,7 @@ static int flower_parse_enc_opts_erspan(
|
|
|
|
|
+ slash = strchr(str, '/');
|
|
|
|
|
+ if (slash) {
|
|
|
|
|
+ *slash++ = '\0';
|
|
|
|
|
+- if (strlen(slash) > XATTR_SIZE_MAX)
|
|
|
|
|
++ if (strlen(slash) > FLOWER_OPTS_MAX)
|
|
|
|
|
+ return -1;
|
|
|
|
|
+ strcpy(mask, slash);
|
|
|
|
|
+ } else {
|
|
|
|
|
+@@ -1376,7 +1379,7 @@ static int flower_parse_enc_opts_erspan(
|
|
|
|
|
+ strcpy(mask + index, ":0xffffffff:0xff:0xff");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+- if (strlen(str) > XATTR_SIZE_MAX)
|
|
|
|
|
++ if (strlen(str) > FLOWER_OPTS_MAX)
|
|
|
|
|
+ return -1;
|
|
|
|
|
+ strcpy(key, str);
|
|
|
|
|
+
|
|
|
|
|
+@@ -1398,7 +1401,7 @@ static int flower_parse_enc_opts_erspan(
|
|
|
|
|
+
|
|
|
|
|
+ static int flower_parse_enc_opts_gtp(char *str, struct nlmsghdr *n)
|
|
|
|
|
+ {
|
|
|
|
|
+- char key[XATTR_SIZE_MAX], mask[XATTR_SIZE_MAX];
|
|
|
|
|
++ char key[FLOWER_OPTS_MAX], mask[FLOWER_OPTS_MAX];
|
|
|
|
|
+ struct rtattr *nest;
|
|
|
|
|
+ char *slash;
|
|
|
|
|
+ int err;
|
|
|
|
|
+@@ -1406,13 +1409,13 @@ static int flower_parse_enc_opts_gtp(cha
|
|
|
|
|
+ slash = strchr(str, '/');
|
|
|
|
|
+ if (slash) {
|
|
|
|
|
+ *slash++ = '\0';
|
|
|
|
|
+- if (strlen(slash) > XATTR_SIZE_MAX)
|
|
|
|
|
++ if (strlen(slash) > FLOWER_OPTS_MAX)
|
|
|
|
|
+ return -1;
|
|
|
|
|
+ strcpy(mask, slash);
|
|
|
|
|
+ } else
|
|
|
|
|
+ strcpy(mask, "ff:ff");
|
|
|
|
|
+
|
|
|
|
|
+- if (strlen(str) > XATTR_SIZE_MAX)
|
|
|
|
|
++ if (strlen(str) > FLOWER_OPTS_MAX)
|
|
|
|
|
+ return -1;
|
|
|
|
|
+ strcpy(key, str);
|
|
|
|
|
+
|
|
|
|
|
+@@ -1433,7 +1436,7 @@ static int flower_parse_enc_opts_gtp(cha
|
|
|
|
|
+
|
|
|
|
|
+ static int flower_parse_enc_opts_pfcp(char *str, struct nlmsghdr *n)
|
|
|
|
|
+ {
|
|
|
|
|
+- char key[XATTR_SIZE_MAX], mask[XATTR_SIZE_MAX];
|
|
|
|
|
++ char key[FLOWER_OPTS_MAX], mask[FLOWER_OPTS_MAX];
|
|
|
|
|
+ struct rtattr *nest;
|
|
|
|
|
+ char *slash;
|
|
|
|
|
+ int err;
|
|
|
|
|
+@@ -1442,14 +1445,14 @@ static int flower_parse_enc_opts_pfcp(ch
|
|
|
|
|
+ slash = strchr(str, '/');
|
|
|
|
|
+ if (slash) {
|
|
|
|
|
+ *slash++ = '\0';
|
|
|
|
|
+- if (strlen(slash) > XATTR_SIZE_MAX)
|
|
|
|
|
++ if (strlen(slash) > FLOWER_OPTS_MAX)
|
|
|
|
|
+ return -1;
|
|
|
|
|
+ strcpy(mask, slash);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ strcpy(mask, "ff:ffffffffffffffff");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+- if (strlen(str) > XATTR_SIZE_MAX)
|
|
|
|
|
++ if (strlen(str) > FLOWER_OPTS_MAX)
|
|
|
|
|
+ return -1;
|
|
|
|
|
+ strcpy(key, str);
|
|
|
|
|
+
|