On Sat, Feb 14, 2026 at 01:24:06PM +0000, David Carlier wrote:
> From: David Carlier <[email protected]>
> 
> 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;
> +                     }
> +             }

This one fails to build with the dummy lib:

    CC      addons/deviceatlas/da.o
    CC      src/version.o
  addons/deviceatlas/da.c: In function 'init_deviceatlas':
  addons/deviceatlas/da.c:233:94: error: invalid use of undefined type 'struct 
header_evidence_entry'
    233 |                                 size_t nl = 
strlen(global_deviceatlas.atlas.header_priorities[hi].name);
        |                                                                       
                       ^
  addons/deviceatlas/da.c:233:98: error: invalid use of undefined type 'struct 
header_evidence_entry'
    233 |                                 size_t nl = 
strlen(global_deviceatlas.atlas.header_priorities[hi].name);
        |                                                                       
                           ^
  addons/deviceatlas/da.c: In function 'da_haproxy_checkinst':
  addons/deviceatlas/da.c:322:70: error: invalid use of undefined type 'struct 
header_evidence_entry'
    322 |                             size_t nl = 
strlen(inst.header_priorities[hi].name);
        |                                                                      ^
  addons/deviceatlas/da.c:322:74: error: invalid use of undefined type 'struct 
header_evidence_entry'
    322 |                             size_t nl = 
strlen(inst.header_priorities[hi].name);
        |                                                                       
   ^

It's because struct header_evidence_entry is never defined, so the
compiler cannot know how to access the name field. As a hack I tried
just this and it fixed it:

  --- a/addons/deviceatlas/dummy/dac.h
  +++ b/addons/deviceatlas/dummy/dac.h
  @@ -492,6 +492,10 @@ size_t da_getpropcount(const da_deviceinfo_t *info);
    * No user servicable parts inside: access should
    * be via the functional API.
    */
  +struct header_evidence_entry {
  +       char *name;
  +};
  +
   struct da_atlas {
       const struct atlas_image *image;
       struct header_evidence_entry *header_priorities;

However I don't know if it will even work with basic test files, so you
may want to double-check this. Also I can confirm that the remaining
patches do build correctly with this change applied.

Regards,
Willy


Reply via email to