[PATCH iproute2 3/3] tc: build ct label strings with hexstring_alloc
From: Stephen Hemminger <stephen@networkplumber.org>
Date: 2026-07-23 19:15:23
Subsystem:
the rest · Maintainer:
Linus Torvalds
flower_print_ct_label() and ct_print_labels() formatted the key and optional mask into a fixed on-stack buffer with manual pointer arithmetic, relying on hexstring_n2a() not to overrun it. Build the "key/mask" string with hexstring_alloc() and asprintf() instead, which sizes to the data and drops the open-coded offset handling. Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> --- tc/f_flower.c | 25 ++++++++++++++----------- tc/m_ct.c | 24 ++++++++++++++---------- 2 files changed, 28 insertions(+), 21 deletions(-)
diff --git a/tc/f_flower.c b/tc/f_flower.c
index 6fc2c6a1..d6844282 100644
--- a/tc/f_flower.c
+++ b/tc/f_flower.c@@ -2619,18 +2619,15 @@ static void flower_print_ct_label(struct rtattr *attr, { const unsigned char *str; bool print_mask = false; + char *key, *out; int data_len, i; - char out[128]; - char *p; if (!attr) return; data_len = RTA_PAYLOAD(attr); - hexstring_n2a(RTA_DATA(attr), data_len, out, sizeof(out)); - p = out + data_len*2; + key = hexstring_alloc(RTA_DATA(attr), data_len); - data_len = RTA_PAYLOAD(attr); str = RTA_DATA(mask_attr); if (data_len != 16) print_mask = true;
@@ -2638,16 +2635,22 @@ static void flower_print_ct_label(struct rtattr *attr, if (str[i] != 0xff) print_mask = true; } + if (print_mask) { - *p++ = '/'; - hexstring_n2a(RTA_DATA(mask_attr), data_len, p, - sizeof(out)-(p-out)); - p += data_len*2; + char *mask = hexstring_alloc(RTA_DATA(mask_attr), data_len); + + if (asprintf(&out, "%s/%s", key, mask) < 0) + out = NULL; + free(mask); + free(key); + } else { + out = key; } - *p = '\0'; print_nl(); - print_string(PRINT_ANY, "ct_label", " ct_label %s", out); + print_string(PRINT_ANY, "ct_label", " ct_label %s", out ? : ""); + + free(out); } static void flower_print_ct_zone(struct rtattr *attr,
diff --git a/tc/m_ct.c b/tc/m_ct.c
index e549cb9c..e5eebbda 100644
--- a/tc/m_ct.c
+++ b/tc/m_ct.c@@ -443,17 +443,15 @@ static void ct_print_labels(struct rtattr *attr, { const unsigned char *str; bool print_mask = false; - char out[256], *p; + char *key, *out; int data_len, i; if (!attr) return; data_len = RTA_PAYLOAD(attr); - hexstring_n2a(RTA_DATA(attr), data_len, out, sizeof(out)); - p = out + data_len*2; + key = hexstring_alloc(RTA_DATA(attr), data_len); - data_len = RTA_PAYLOAD(attr); str = RTA_DATA(mask_attr); if (data_len != 16) print_mask = true;
@@ -461,15 +459,21 @@ static void ct_print_labels(struct rtattr *attr, if (str[i] != 0xff) print_mask = true; } + if (print_mask) { - *p++ = '/'; - hexstring_n2a(RTA_DATA(mask_attr), data_len, p, - sizeof(out)-(p-out)); - p += data_len*2; + char *mask = hexstring_alloc(RTA_DATA(mask_attr), data_len); + + if (asprintf(&out, "%s/%s", key, mask) < 0) + out = NULL; + free(mask); + free(key); + } else { + out = key; } - *p = '\0'; - print_string(PRINT_ANY, "label", " label %s", out); + print_string(PRINT_ANY, "label", " label %s", out ? : ""); + + free(out); } static void ct_print_helper(struct rtattr *family, struct rtattr *proto, struct rtattr *name)
--
2.53.0