Hi,

HAProxy 3.2.6 was released on 2025/10/03. It added 57 new commits
after version 3.2.5.

As promised in the 3.2.6 announce, here is the usual description of bugs
fixed f76 by this release:

 * The most important one is obviously the mjson JSON decoder issue
   described in the previous mail. Decoding of numbers with large exponents
   was eating a lot of CPU and could even trigger the watchdog and kill the
   process. "json_query()", "jwt_header_query()", and "jwt_payload_query()"
   converters was affected. This bug was assigned CVE-2025-11230 and
   affected all versions featuring the JSON decoder, or 2.4 and above.

 * While it is not strictly speaking bug fixes, several improvements on
   sitck-tables were backported. The locking between stick-tables and peers
   was partially relaxed so that we don't insist too long anymore when
   detecting contention. Such contention used to cause severe performance
   degradation on some systems, sometimes even triggering the watchdog due
   to multiple milliseconds delays multiplied by the number of entries
   processed at once. More batching and delayed work was used instead,
   resulting in higher overall performance and a much smoother traffic flow.

 * A number of multi-threaded tasks were moved to single thread (e.g.
   table expiration, resolvers connections etc), because these were
   found to cause a lot of contention in the scheduler on high CPU count
   machines, for no added value.

 * On resolvers, the result of a "do-resolv" action was not cached, unlike
   it is stated in the documentation. The "hold valid" time is now
   respected. In addition, the round-robin selection on records in DNS
   answers was restored. It was accidentally broken during 2.5 development
   cycle. While it is an undocumented feature, some users relies on it,
   especially with the "do-resolv" action.

 * Several issues with acme was fixed: A possible UAF on a acme context, a
   crash because of an initialisation issue during startup of the acme
   sections, a crash with AWS-LC because some internal data were released
   with the libc free() function instead of OPENSSL_free() and two possible
   overflow raised by Coverity.

 * Allocation failures were not properly handled in the Leastconn load
   balancing algorithm when a server was reinserted in the tree. Crashes
   could be experienced if the operation failed.

 * On server side, a configured sni could be used as pool name for idle
   connections for non-SSL servers. While this kind of configuration is
   unlikely, it could result of inheritance of some default parameters. In
   that case, the connection reuse could be totally inoperative.

 * There was an issue when loading CA certificates from a directory. Only
   the first certificate of each file was loaded. It was an issue on some
   systems (debian/ubuntu ones were not affected). The issue was fixed by
   using X509_STORE_load_locations() on each file instead of loading
   certificates by hand.

 * In both H2 and H3, the 'Z' character (in upper case) was not rejected as
   expected from header field names. Thanks to @zhanhb, it now fixed.

 * For the HTTP compression, the "minsize-req" and "minsize-res" options
   were evaluated for messages with a not-fully known size. So it was
   possible to skip the compression for large messages because the available
   payload was under the configured limit. The options are now considered
   only when the size of the whole message is known.

 * Errors coud be erroneously reported during the configuration parsing when
   the same virtual map (with 'virt@' prefix) was used at diffrent places.
   In addition, optional maps (with 'opt@' prefix) were not properly
   referenced. The prefix was not removed from the map name as
   expected. Both issues were fixed.

 * The detection of stuck tasks was improved to be more accurate and limit
   wrong/ambiguous watchdog warnings.

In addition to these fixes, the "ssl_bc_sni" sample fetch function was
backported. It can be useful during debugging sessions to know what SNI was
configured on a connection going to a server, for example to match it
against what the server saw or to detect cases where a server would route on
SNI instead of Host.

Finally, some improvements on debugging tools where backported.

Thanks everyone for your help.

Please find the usual URLs below :
   Site index       : https://www.haproxy.org/
   Documentation    : https://docs.haproxy.org/
   Wiki             : https://github.com/haproxy/wiki/wiki
   Discourse        : https://discourse.haproxy.org/
   Slack channel    : https://slack.haproxy.org/
   Issue tracker    : https://github.com/haproxy/haproxy/issues
   Q&A from devs    : https://github.com/orgs/haproxy/discussions
   Sources          : https://www.haproxy.org/download/3.2/src/
   Git repository   : https://git.haproxy.org/git/haproxy-3.2.git/
   Git Web browsing : https://git.haproxy.org/?p=haproxy-3.2.git
   Changelog        : https://www.haproxy.org/download/3.2/src/CHANGELOG
   Dataplane API    : 
https://github.com/haproxytech/dataplaneapi/releases/latest
   Pending bugs     : https://www.haproxy.org/l/pending-bugs
   Reviewed bugs    : https://www.haproxy.org/l/reviewed-bugs
   Code reports     : https://www.haproxy.org/l/code-reports
   Latest builds    : https://www.haproxy.org/l/dev-packages


---
Complete changelog :
Christopher Faulet (14):
      MINOR: server: Parse sni and pool-conn-name expressions in a dedicated 
function
      BUG/MEDIUM: server: Use sni as pool connection name for SSL server only
      BUG/MINOR: server: Update healthcheck when server settings are changed 
via CLI
      BUG/MINOR: tcpcheck: Don't use sni as pool-conn-name for non-SSL 
connections
      BUG/MEDIUM: resolvers: Properly cache do-resolv resolution
      BUG/MINOR: resolvers: Restore round-robin selection on records in DNS 
answers
      BUG/MEDIUM: resolvers: Test for empty tree when getting a record from DNS 
answer
      BUG/MEDIUM: resolvers: Make resolution owns its hostname_dn value
      BUG/MEDIUM: resolvers: Accept to create resolution without hostname
      BUG/MEDIUM: resolvers: Wake resolver task up whne unlinking a stream 
requester
      BUG/MINOR: pools: Fix the dump of pools info to deal with buffers 
limitations
      BUG/MINOR: compression: Test payload size only if content-length is 
specified
      BUG/MINOR: pattern: Properly flag virtual maps as using samples
      BUG/MINOR: pattern: Fix pattern lookup for map with opt@ prefix

Olivier Houchard (6):
      BUG/MEDIUM: stick-tables: Don't let table_process_entry() handle refcnt
      MINOR: mt_list: Implement MT_LIST_POP_LOCKED()
      BUG/MEDIUM: stick-tables: Make sure not to free a pending entry
      MEDIUM: servers: Schedule the server requeue target on creation
      MEDIUM: fwlc: Make it so fwlc_srv_reposition works with unqueued srv
      BUG/MEDIUM: fwlc: Handle memory allocation failures.

William Lallemand (9):
      BUG/MINOR: acme/cli: wrong description for "acme challenge_ready"
      BUILD: halog: misleading indentation in halog.c
      CI: github: build halog on the vtest job
      BUG/MINOR: acme: don't unlink from acme_ctx_destroy()
      BUG/MEDIUM: acme: cfg_postsection_acme() don't init correctly acme 
sections
      BUG/MEDIUM: acme: free() of i2d_X509_REQ() with AWS-LC
      BUG/MINOR: acme: possible overflow on scheduling computation
      BUG/MINOR: acme: possible overflow in acme_will_expire()
      BUG/MEDIUM: ssl: ca-file directory mode must read every certificates of a 
file

Willy Tarreau (26):
      MINOR: stick-tables: limit the number of visited nodes during expiration
      OPTIM: stick-tables: exit expiry faster when the update lock is held
      MINOR: debug: report the process id in warnings and panics
      DEBUG: stream: count the number of passes in the connect loop
      MINOR: debug: report the number of loops and ctxsw for each thread
      MINOR: debug: report the time since last wakeup and call
      DEBUG: peers: export functions that use locks
      MINOR: stick-table: permit stksess_new() to temporarily allocate more 
entries
      MEDIUM: stick-tables: relax stktable_trash_oldest() to only purge what is 
needed
      MEDIUM: stick-tables: give up on lock contention in process_table_expire()
      MEDIUM: stick-tables: don't wait indefinitely in 
stktable_add_pend_updates()
      MEDIUM: peers: don't even try to process updates under contention
      MEDIUM: stick-table: move process_table_expire() to a single thread
      MEDIUM: peers: move process_peer_sync() to a single thread
      MINOR: activity: indicate the number of calls on "show tasks"
      MINOR: tools: don't emit "+0" for symbol names which exactly match known 
ones
      OPTIM: sink: reduce contention on sink_announce_dropped()
      MEDIUM: dns: bind the nameserver sockets to the initiating thread
      MEDIUM: resolvers: make the process_resolvers() task single-threaded
      MINOR: sched: let's permit to share the local ctx between threads
      MINOR: sched: pass the thread number to is_sched_alive()
      BUG/MEDIUM: wdt: improve stuck task detection accuracy
      MINOR: ssl: add the ssl_bc_sni sample fetch function to retrieve backend 
SNI
      DOC: config: clarify some known limitations of the json_query() converter
      BUG/CRITICAL: mjson: fix possible DoS when parsing numbers
      BUG/MEDIUM: resolvers: break an infinite loop in 
resolv_get_ip_from_response()

zhanhb (2):
      BUG/MINOR: h2: forbid 'Z' as well in header field names checks
      BUG/MINOR: h3: forbid 'Z' as well in header field names checks

---
Christopher Faulet


Reply via email to