Hi,

HAProxy 3.3-dev8 was released on 2025/09/05. It added 124 new commits
after version 3.3-dev7.

The activity sped up a bit, I'm seeing around 45 patches which are
bug fixes all over the place, and some new features and architectural
updates. I'll skip the bugs to focus on the rest:

- rework of the server-side idle connections: working on QUIC backend
  support exhibited some limitations of the management of idle conns,
  which had relations to the runtime server deletion. The whole stuff
  was reworked to be cleaner and more flexible, and it will also address
  some possible corner cases which were not well addressed previously.
  For example deleting a server will now work more reliably because the
  preliminary shutdown will have killed idle connections as well
  (previously it didn't). Also, private connections can now be purged,
  which was not possible before (it's the connections in reuse-never
  mode or with basic auth).

- the stats counters can now be preserved across reloads (experimental).
  By designating a shared file (preferably in a ramfs/tmpfs) with the
  "shm-stats-file" directive, the listener/frontend/backend/server
  counters will be mapped there, and all processes attached to the same
  map will use the same counters. I.e. the old, fading away process can
  continue to update counters as the traffic finishes while the new
  process also updates them. There are some prerequisites though: just
  like with the stats-file that is meant to be loaded on startup, objects
  that produce such counters must have a GUID configured to uniquely
  identify them. This means that config ordering, addition/removal etc
  will have no undesired effect. Note that it will equally work across
  restarts or even crashes, as long as the restart is quick. Each attached
  process emits a heartbeat to indicate its presence and the file remains
  valid some time after the last process has quit (I seem to remember it's
  30s). Please give this a test, I know that some users were interested in
  seeing shared stats to get smooth transitions in their graphs. You might
  have great suggestions that would be better addressed before the release.

- as previously discussed, there was an opportunity to change the default
  LB algorithm from "roundrobin" to "random", and it was well supported
  (approvals and no objection). So this was changed in this version. It
  only concerns configs which do not have the "balance" keyword or have
  it with no algorithm specified. The rest is of course unchanged.

- in last announce, we proposed to bump the minimum default linux kernel
  version to 4.17 since it's older than all currently maintained LTS
  distros and will allow us to enable KTLS support by default. Given that
  nobody objected either, it was now done. Those who build on older
  kernels (unmaintainted systems) can continue to do so using the
  linux-glibc-legacy target or keeping the same target and disabling
  unsupported settings (e.g. USE_KTLS=0).

- we've seen an increase of configs not setting any "user" directives
  and started as root, hence running as root. From a security perspective
  this is a bad practice, but given how some configs are generated and
  deployed nowadays, it feels very likely that users didn't even notice,
  and do not even set chroots etc. So a warning was added when a config
  is started like this, suggesting to set a user or uid, either to
  something non-root to stay secure, or to root if that's what is desired,
  in which case it will be explicit. It then also recommends the use of a
  chroot, to try to encourage users to adopt secure practices.

- another warning was added for static builds if user/groups are used
  because in such cases it's common that it will not properly resolve
  (depending how the libc delegates such resolutions to other libs),
  and we've even seen crashes in the libc itself (unchecked function
  returns it seems).

- The http-send-name-header directive is sometimes abused to a point
  where it denaturates the HTTP protocol and violates its integrity
  in possibly dangerous ways, and it seems that users do not realize it.
  It's no longer permitted to set it to "connection", "content-length",
  "host", "transfer-encoding". To be honest, I wouldn't be surprised
  if we discover horrors after the release justified by "for me it was
  convenient to do that", but at least it will make sure that users no
  longer expose themselves to dirty bugs or even smuggling, and that
  they properly configure their servers instead.

- a warning is now emitted when "strict-sni" and "default-crt" are used
  together, because it makes no sense and likely results from a mistake
  or a misunderstanding.

- the ACL parser was a bit lax and silently used the last matching method
  on a line if multiple ones were specified with "-m". Now it will reject
  such errors. Also in the same vein, some configs show a common mistake
  consisting in using a keyword implying a match method but replacing it
  with another one, e.g. "path_beg -m reg" (hint, here it's the last one
  which works). These ambiguous ones will now emit a warning explaining
  how to fix them.

And the rest has less impact. We have a new "base2" converter to turn
raw data or IP addresses to binary forms, useful for combining address
prefixes with other patterns in a same acl/map entry, new cmdline options
to show only the version in various forms (branch, base, full) using
-vq/vqb/vqs, and various CLI, CI and DOC updates.

There hasn't been much feedback on 3.3 during the summer vacation period
recently, let's hope that persistent stats, KTLS and QUIC backend will
encourage more testing from now on.

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.3/src/
   Git repository   : https://git.haproxy.org/git/haproxy.git/
   Git Web browsing : https://git.haproxy.org/?p=haproxy.git
   Changelog        : https://www.haproxy.org/download/3.3/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

Willy
---
Complete changelog :
Alexander Stephan (6):
      BUG/MINOR: halog: Add OOM checks for calloc() in 
filter_count_srv_status() and filter_count_url()
      BUG/MINOR: log: Add OOM checks for calloc() and malloc() in logformat 
parser and dup_logger()
      BUG/MINOR: acl: Add OOM check for calloc() in smp_fetch_acl_parse()
      BUG/MINOR: cfgparse: Add OOM check for calloc() in cfg_parse_listen()
      BUG/MINOR: compression: Add OOM check for calloc() in 
parse_compression_options()
      BUG/MINOR: tools: Add OOM check for malloc() in indent_msg()

Amaury Denoyelle (44):
      BUG/MEDIUM: mux-h2: fix crash on idle-ping due to unwanted ABORT_NOW
      BUG/MEDIUM: quic: reset padding when building GSO datagrams
      BUG/MINOR: quic: do not emit probe data if CONNECTION_CLOSE requested
      BUG/MAJOR: quic: fix INITIAL padding with probing packet only
      BUG/MINOR: quic: don't coalesce probing and ACK packet of same type
      MINOR: quic: centralize padding for HP sampling on packet building
      BUG/MINOR: connection: rearrange union list members
      BUG/MINOR: connection: remove extra session_unown_conn() on reverse
      MINOR: cli: display failure reason on wait command
      BUG/MINOR: server: decrement session idle_conns on del server
      BUG/MINOR: mux-quic: do not access conn after idle list insert
      MINOR: session: document explicitely that session_add_conn() is safe
      MINOR: session: uninline functions related to BE conns management
      MINOR: session: refactor alloc/lookup of sess_conns elements
      MEDIUM: session: protect sess conns list by idle_conns_lock
      MINOR: server: shard by thread sess_conns member
      MEDIUM: server: close new idle conns if server in maintenance
      MEDIUM: session: close new idle conns if server in maintenance
      MINOR: server: cleanup idle conns for server in maint already stopped
      MINOR: muxes: enforce thread-safety for private idle conns
      MEDIUM: conn/muxes/ssl: reinsert BE priv conn into sess on IO completion
      MEDIUM: conn/muxes/ssl: remove BE priv idle conn from sess on IO
      MEDIUM: mux-quic: enforce thread-safety of backend idle conns
      MAJOR: server: implement purging of private idle connections
      MEDIUM: session: account on server idle conns attached to session
      MAJOR: server: do not remove idle conns in del server
      MINOR: muxes: adjust takeover with buf_wait interaction
      OPTIM: backend: set release on takeover for strict maxconn
      MINOR: doc: add missing statistics column
      MINOR: doc: add missing statistics column
      MINOR: stats: display new curr_sess_idle_conns server counter
      MINOR: proxy: extend "show servers conn" output
      BUG/BUILD: stats: fix build due to missing stat enum definition
      BUG/MAJOR: mux-quic: fix crash on reload during emission
      MINOR: conn/muxes/ssl: add ASSUME_NONNULL() prior to _srv_add_idle
      MINOR: quic/flags: complete missing flags
      BUG/MINOR: quic: fix room check if padding requested
      BUG/MINOR: quic: fix padding issue on INITIAL retransmit
      BUG/MINOR: quic: pad Initial pkt with CONNECTION_CLOSE on client
      MEDIUM: quic: strengthen BUG_ON() for unpad Initial packet on client
      BUG/MINOR: check: ensure check-reuse is compatible with SSL
      BUG/MINOR: check: fix dst address when reusing a connection
      BUG/MEDIUM: conn: fix UAF on connection after reversal on edge
      BUG/MINOR: connection: streamline conn detach from lists

Aurelien DARRAGON (17):
      MINOR: http_ana: fix typo in http_res_get_intercept_rule
      BUG/MEDIUM: http_ana: handle yield for "stats http-request" evaluation
      MINOR: haproxy: abort config parsing on fatal errors for post parsing 
hooks
      MEDIUM: server: split srv_init() in srv_preinit() + srv_postinit()
      MINOR: proxy: handle shared listener counters preparation from 
proxy_postcheck()
      MINOR: counters: retrieve detailed errmsg upon failure with 
counters_{fe,be}_shared_prepare()
      MINOR: stats-file: introduce shm-stats-file directive
      MEDIUM: stats-file: processes share the same clock source from 
shm-stats-file
      MINOR: stats-file: add process slot management for shm stats file
      MEDIUM: stats-file/counters: store and preload stats counters as shm file 
objects
      DOC: config: document "shm-stats-file" directive
      OPTIM: stats-file: don't unnecessarily die hard on 
shm_stats_file_reuse_object()
      MINOR: compiler: add ALWAYS_PAD() macro
      BUILD: stats-file: fix aligment issues
      MINOR: stats-file: reserve some bytes in exported structs
      MEDIUM: stats-file: add some BUG_ON() guards to ensure exported structs 
are not changed by accident
      BUG/MINOR: log: fix potential memory leak upon error in 
add_to_logformat_list()

Christopher Faulet (15):
      BUG/MAJOR: stream: Remove READ/WRITE events on channels after analysers 
eval
      MINOR: applet: Rely on applet flag to detect the new api
      MINOR: applet: Add function to test applet flags from the appctx
      MINOR: applet: Add a flag to know an applet is using HTX buffers
      MINOR: applet: Make some applet functions HTX aware
      MEDIUM: applet: Set .rcv_buf and .snd_buf functions on default ones if 
not set
      BUG/MEDIUM: mux-spop: Reject connection attempts from a non-spop frontend
      BUG/MEDIUM: spoe: Improve error detection in SPOE applet on client abort
      MEDIUM: proxy: Reject some header names for 'http-send-name-header' 
directive
      REG-TESTS: map_redirect: Don't use hdr_dom in ACLs with "-m end" matching 
method
      MINOR: acl: Only allow one '-m' matching method
      MINOR: acl; Warn when matching method based on a suffix is overwritten
      BUG/MEDIUM: server: Duplicate healthcheck's alpn inherited from default 
server
      BUG/MINOR: server: Duplicate healthcheck's sni inherited from default 
server
      BUG/MINOR: acl: Properly detect overwritten matching method

Collison, Steven (1):
      DOC: proxy-protocol: Make example for PP2_SUBTYPE_SSL_SIG_ALG accurate

Frederic Lecaille (11):
      BUG/MINOR: quic-be: missing Initial packet number space discarding
      BUG/MEDIUM: quic-be: crash after backend CID allocation failures
      BUG/MEDIUM: quic-be: avoid crashes when releasing Initial pktns
      BUG/MINOR: quic: reorder fragmented RX CRYPTO frames by their offsets
      MINOR: quic: remove ->offset qf_crypto struct field
      BUG/MINOR: mux-quic: trace with non initialized qcc
      CLEANUP: quic: remove a useless CRYPTO frame variable assignment
      BUG/MEDIUM: quic: CRYPTO frame freeing without eb_delete()
      BUG/MINOR: quic: ignore AGAIN ncbuf err when parsing CRYPTO frames
      MINOR: quic: Add more information about RX packets
      BUG/MEDIUM: quic-be: too early SSL_SESSION initialization

Ilia Shipitsin (1):
      CI: fix syntax of Quic Interop pipelines

Maximilian Moehl (1):
      MINOR: sample: Add base2 converter

Nikita Kurashkin (1):
      MINOR: version: add -vq, -vqb, and -vqs flags for concise version output

Valentine Krasnobaeva (2):
      MINOR: dns: dns_connect_nameserver: fix fd leak at error path
      BUG/MINOR: acl: set arg_list->kw to aclkw->kw string literal if aclkw is 
found

William Lallemand (12):
      BUG/MEDIUM: ssl: apply ssl-f-use on every "ssl" bind
      REGTESTS: jwt: create dynamically "cert.ecdsa.pem"
      DOC: configuration: reword 'generate-certificates'
      MINOR: ssl: diagnostic warning when both 'default-crt' and 'strict-sni' 
are used
      MEDIUM: ssl: convert diag to warning for strict-sni + default-crt
      DOC: configuration: clarify 'default-crt' and implicit default 
certificates
      BUG/MEDIUM: mworker: fix startup and reload on macOS
      BUILD: mworker: fix ignoring return value of 'read'
      DOC: unreliable sockpair@ on macOS
      DOC: configuration: confuse "strict-mode" with "zero-warning"
      DOC: configuration: rework the jwt_verify keyword documentation
      MEDIUM: cfgparse: warn when using user/group when built statically

Willy Tarreau (13):
      BUG/MINOR: haproxy: be sure not to quit too early on soft stop
      BUILD: acl: silence a possible null deref warning in parse_acl_expr()
      BUG/MEDIUM: stick-tables: don't leave the expire loop with elements 
deleted
      BUG/MINOR: stick-tables: never leave used entries without expiration
      BUG/MEDIUM: peers: don't fail twice to grab the update lock
      MINOR: stick-tables: limit the number of visited nodes during expiration
      OPTIM: stick-tables: exit expiry faster when the update lock is held
      REGTESTS: explicitly use "balance roundrobin" where RR is needed
      MAJOR: backend: switch the default balancing algo to "random"
      MEDIUM: init: always warn when running as root without being asked to
      BUILD: trace: silence a bogus build warning at -Og
      MINOR: trace: accept trace spec right after "-dt" on the command line
      BUILD: makefile: bump the default minimum linux version to 4.17

---


Reply via email to