From 1009ca41607af76a7aadd7c6fd64448abb887be2 Mon Sep 17 00:00:00 2001 From: Amaury Denoyelle Date: Wed, 27 Mar 2024 15:15:19 +0100 Subject: [PATCH] MINOR: guid: restrict guid format GUID format is unspecified to allow users to choose the naming scheme. Some restrictions however are added by this patch, mainly to ensure coherence and memory usage. The first restriction is on the length of GUID. No more than 127 characters can be used to prevent memory over consumption. The second restriction is on the character set allowed in GUID. Utility function invalid_char() is used for this : it allows alphanumeric values and '-', '_', '.' and ':'. --- include/haproxy/guid-t.h | 3 +++ src/guid.c | 13 +++++++++++++ 2 files changed, 16 insertions(+) diff --git a/include/haproxy/guid-t.h b/include/haproxy/guid-t.h index 41645d729..9eea355d1 100644 --- a/include/haproxy/guid-t.h +++ b/include/haproxy/guid-t.h @@ -4,6 +4,9 @@ #include #include +/* Maximum GUID size excluding final '\0' */ +#define GUID_MAX_LEN 127 + struct guid_node { struct ebpt_node node; /* attach point into GUID global tree */ enum obj_type *obj_type; /* pointer to GUID obj owner */ diff --git a/src/guid.c b/src/guid.c index 178353ba5..1f2116427 100644 --- a/src/guid.c +++ b/src/guid.c @@ -26,6 +26,18 @@ int guid_insert(enum obj_type *objt, const char *uid, char **errmsg) struct guid_node *dup; struct ebpt_node *node; char *dup_name = NULL; + const char *c; + + if (strlen(uid) > GUID_MAX_LEN) { + memprintf(errmsg, "UID too big"); + goto err; + } + + c = invalid_char(uid); + if (c) { + memprintf(errmsg, "invalid character '%c'", c[0]); + goto err; + } switch (obj_type(objt)) { default: @@ -52,6 +64,7 @@ int guid_insert(enum obj_type *objt, const char *uid, char **errmsg) return 0; err: + ALREADY_CHECKED(guid); ha_free(&guid->node.key); ha_free(&dup_name); return 1;