From 076ec9443c6d3e40f2b428be0e362594feb833ba Mon Sep 17 00:00:00 2001 From: David Carlier Date: Sat, 14 Feb 2026 13:24:06 +0000 Subject: [PATCH] MINOR: deviceatlas: precompute maxhdrlen to skip oversized headers early Precompute the maximum header name length from the atlas evidence headers at init and hot-reload time. Use it in da_haproxy_fetch() to skip headers early that cannot match any known DeviceAtlas evidence header, avoiding unnecessary string copies and comparisons. --- addons/deviceatlas/da.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/addons/deviceatlas/da.c b/addons/deviceatlas/da.c index 2c09c2272..0c3311b61 100644 --- a/addons/deviceatlas/da.c +++ b/addons/deviceatlas/da.c @@ -31,6 +31,7 @@ static struct { da_atlas_t atlas; da_evidence_id_t useragentid; da_severity_t loglevel; + size_t maxhdrlen; char separator; unsigned char daset:1; } global_deviceatlas = { @@ -42,6 +43,7 @@ static struct { .atlasmap = NULL, .atlasfd = -1, .useragentid = 0, + .maxhdrlen = 0, .daset = 0, .separator = '|', }; @@ -224,6 +226,15 @@ static int init_deviceatlas(void) global_deviceatlas.useragentid = da_atlas_header_evidence_id(&global_deviceatlas.atlas, "user-agent"); + { + size_t hi; + global_deviceatlas.maxhdrlen = 16; + for (hi = 0; hi < global_deviceatlas.atlas.header_evidence_count; hi++) { + size_t nl = strlen(global_deviceatlas.atlas.header_priorities[hi].name); + if (nl > global_deviceatlas.maxhdrlen) + global_deviceatlas.maxhdrlen = nl; + } + } if ((global_deviceatlas.atlasfd = shm_open(ATLASMAPNM, O_RDWR, 0660)) != -1) { global_deviceatlas.atlasmap = mmap(NULL, ATLASTOKSZ, PROT_READ | PROT_WRITE, MAP_SHARED, global_deviceatlas.atlasfd, 0); if (global_deviceatlas.atlasmap == MAP_FAILED) { @@ -304,6 +315,15 @@ static void da_haproxy_checkinst(void) free(global_deviceatlas.atlasimgptr); global_deviceatlas.atlasimgptr = cnew; global_deviceatlas.atlas = inst; + { + size_t hi; + global_deviceatlas.maxhdrlen = 16; + for (hi = 0; hi < inst.header_evidence_count; hi++) { + size_t nl = strlen(inst.header_priorities[hi].name); + if (nl > global_deviceatlas.maxhdrlen) + global_deviceatlas.maxhdrlen = nl; + } + } base[0] = 0; ha_notice("deviceatlas : new instance, data file date `%s`.\n", da_getdatacreationiso8601(&global_deviceatlas.atlas)); @@ -464,8 +484,7 @@ static int da_haproxy_fetch(const struct arg *args, struct sample *smp, const ch continue; } - /* The HTTP headers used by the DeviceAtlas API are not longer */ - if (n.len >= sizeof(hbuf)) { + if (n.len > global_deviceatlas.maxhdrlen || n.len >= sizeof(hbuf)) { continue; } -- 2.47.3