BUG/MINOR: stream: Avoid recursive evaluation for unique-id based on itself
authorChristopher Faulet <cfaulet@haproxy.com>
Mon, 23 Jun 2025 05:33:06 +0000 (07:33 +0200)
committerChristopher Faulet <cfaulet@haproxy.com>
Wed, 1 Oct 2025 13:32:32 +0000 (15:32 +0200)
There is nothing that prevent a "unique-id-format" to reference itself,
using '%ID' or '%[unique-id]'. If the sample fetch function is used, it
leads to an infinite loop, calling recursively the function responsible to
generate the unique ID.

One solution is to detect it during the configuration parsing to trigger an
error. With this patch, we just inhibit recursive calls by considering the
unique-id as empty during its evaluation. So "id-%[unique-id]" lf string
will be evaluated as "id-".

This patch must be backported to all stable versions.

(cherry picked from commit fb7b5c8a53cb4f19a223abd20660d47162aa8708)
Signed-off-by: Willy Tarreau <w@1wt.eu>
(cherry picked from commit dfbb00ac1410af65d2befe3e94afb6cfc137b220)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
(cherry picked from commit b9968b4d131918075c00708fd6ad5b51fc3146c5)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>

src/stream.c

index 5cee7d7..f3f64fb 100644 (file)
@@ -2892,12 +2892,12 @@ struct ist stream_generate_unique_id(struct stream *strm, struct lf_expr *format
        }
        else {
                char *unique_id;
-               int length;
+
                if ((unique_id = pool_alloc(pool_head_uniqueid)) == NULL)
                        return IST_NULL;
 
-               length = build_logline(strm, unique_id, UNIQUEID_LEN, format);
-               strm->unique_id = ist2(unique_id, length);
+               strm->unique_id = ist2(unique_id, 0);
+               strm->unique_id.len = build_logline(strm, unique_id, UNIQUEID_LEN, format);
 
                return strm->unique_id;
        }