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;