From ac547ad027e3d4e283202ecb487cf54707234491 Mon Sep 17 00:00:00 2001 From: Stephen Hemminger 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 --- 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 #include #include -#include + #include #include #include @@ -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);