Hi,
HAProxy 3.4-dev10 was released on 2026/04/29. It added 162 new commits
after version 3.4-dev9.
Small fixes and cleanups have really started, it's pleasant. We have 72
bug fixes (most minor), 21 cleanups, 5 doc updates. There were also some
important bugs that were fixed:
- the task expiration got corrupted in 3.4-dev8 on 32-bit machines, and
was the main cause for some regtests failing there. It was fixed.
- an old super-rare race where task_schedule() being called on a task
could cause a crash was fixed and the fix backported, but it turned out
that it can cause a deadlock with the lock held by idle connections
tasks, that it's difficult to reproduce but sadly it happens much
more often than the one it was fixing. A new fix was emitted which
better addresses the issue, and which will have to be backported since
the one above was backported as well. It's what caused a few watchdog
reports a few days ago.
- end of stream on H2 HEADERS frames wouldn't trigger the length check
against content-length (only DATA did), which could, when combined
with "http-reuse never" and a server responding early, be used to
form a smuggled request that would escape filtering rules. This was
already backported.
- the H1 mux on 32-bit machines would only advertise the 32 lower bits
of the chunk size, which could be used to form request or response
smuggling. It's not as if 32-bit machines were still omnipresent but
they do still exist, so this will have to be backported.
- the presence of commas in Host header and authority was permitted
and would be used to compare the values, which then would differ
when read via hdr(host) which splits them on commas, and under
certain circumstances, trigger crashes (at least it did in the
OSS-Fuzz environment when injecting the values directly at the HTX
layer). Even though the spec permits commas in authorities (not in
domain names), there is currently no use case for this and it causes
an ambiguity with the historical use of hdr(host), so we preferred
to just deny them. This will be backported as far as 2.8 soon.
- the ip.fp() converter that establishes a SYN fingerprint from a sample
had a nasty case of possible infinite loop, which normally doesn't
exist with a real TCP SYN packet, but we never know how fingerprints
are fed to it.
Aside these, there were some build fixes, a good bunch of CI updates, and
some small general updates, among which:
- cli: dynamic large payloads are now supported, up to 128kB by default,
can be changed using tune.cli.max-payload-size. This can be useful for
those dealing with large maps or certificates. The payload delimiter
can also be enlarged up to 64 chars (e.g. sha256sum of a random).
- lb algos: internal cleanups: this is one of the oldest parts of the
code, and with algos being added once every 3-4 years on average, it's
never the good opportunity for implementing a clean registration instead
of copy-pasting function pointer assignment. The planned cleanup has
started with LB algo descriptors, which may even open the way for more
modular things in 3.5 if opportunities arise (e.g. experiments with
Peak EWMA etc).
- connections: owners are now better defined, and this will avoid the
recently introduced issue of idle h2 backend connections that would
be closed after the last stream finished.
- the default max-threads-per-group was finally set to 16 after lots of
experimentation, confirming good guesses from months ago, showing that
compared to the previous 64, it can significantly lower contention in
the system at the file descriptor layer (performance are doubled on a
64-core machine), and it happens to match what's already applied by
default on multi-CCX systems like EPYC processors.
- the opentracing filter now emits a deprecation warning, as indicated in
the wiki. We'll backport it to 3.3 as a notice message, since it was
forgotten at release time despite being documented as such (wiki and
internal doc).
- ACME now supports IP SAN in certificate requests, which should allow
to use certificates when connecting with a pure IP address. ACME
profiles were also implemented, allowing the CA to select the best
issuance policy (classic, shortlived etc).
- QUIC now implements termination events ("term_events") which are way
more detailed than the usual 2-character termination codes. Various
other minor cleanups were done in the area.
- various opentelemetry fixes and cleanups
- a new converter "fe_exists()" tests for the existence of a frontend
whose name is in the input sample.
That's about all for now. We still have plenty of small fixes and cleanups
to apply (typically a number of identified places where the classical leak
can happen on out-of-memory), which are totally harmless but ought to be
fixed so that we don't rediscover them later.
We're now about 4 weeks from the release, and time flies very fast in
May, so let's stay focused on testing, bug reporting and cleanups. As
usual in order to help with testing, we'll finish the period with one
release every week.
Due to the regression in stable releases, just do not update right now
to the recently released stable versions for branches 2.8 and above,
we're finishing the needed backports and we should have a new set of
releases by tomorrow. Many thanks to those who reported the regression
as soon as they noticed it!
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.4/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.4/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 :
Amaury Denoyelle (28):
BUG/MINOR: mux_quic: limit avail_streams() to 2^62
MINOR: h3: simplify GOAWAY local emission
MEDIUM: h3: prevent new streams on GOAWAY reception
MINOR: mux-quic: release BE idle conn after GOAWAY reception
BUG/MINOR: xprt_qstrm: read record length in 64bits
BUG/MINOR: mux_quic: convert QCC rx.rlen to 64bits
BUG/MINOR: xprt_qstrm: reduce max record length check
BUG/MINOR: mux_quic: prevent crash on qc_frm_free() with QMux
BUG/MINOR: xprt_qstrm: ensure all local TPs are allocated
BUG/MINOR: xprt_qstrm: prevent crash if conn release on MUX wake
BUG/MINOR: mux_quic: do not release conn on qcc_recv() for QMux
MINOR: xprt_qstrm: remove unused subs
MINOR: connection: document conn_create_mux()
MINOR: xprt_qstrm: implement close callback
MINOR: mux_quic: refactor QMux send frames function
MINOR: mux_quic: use dynamic Tx streams buffers for QMux
MINOR: mux_quic: use dynamic conn buffers for QMux
MINOR: mux_quic/xprt_qstrm: simplify Rx buffer transfer
MINOR: mux_quic: receive MAX_STREAMS_BIDI frames in QMux
MINOR: mux_quic: handle conn errors on QMux without crash
MINOR: mux_quic: handle incomplete QMux record read
BUG/MEDIUM: stats: fix crash on 'dump stats-file'
MINOR: mux_quic: return conn error code in debug string
MINOR: mux_quic: display QCS sd on traces
MINOR: mux_quic/h3: report termination events at connection level
MINOR: mux_quic/h3: report termination events at stream layer
MINOR: mux_quic: remove superfluous b_size() before b_alloc()
BUG/MINOR: mux_quic: free frames emitted with QMux
Aurelien DARRAGON (2):
BUG/MINOR: task: fix uninitialised read in run_tasks_from_lists()
MINOR: compression: prefix compression oriented functions with "comp_"
BiancaDogareci (1):
BUG/MINOR: ssl: fix memory leak on realloc failure in acme.ips
Christopher Faulet (40):
MINOR: cli: Handle the paylod pattern as a pointer in the cmdline buffer
MEDIUM: cli: Make a buffer for the command payload
MEDIUM: cli: Add support for dynamically allocated payloads
MEDIUM: cli: increase the payload pattern up to 64 bytes
MINOR: stream: Move the HTTP txn in an union
MINOR: stream: Add flags to identify the stream tansaction when allocated
MINOR: stream: Use a pcli transaction to replace pcli_* members
CLEANUP: applet: Remove useless shadow pointer from appctx
BUG/MINOR: mux-h1: Fix condition to send null-chunk for bodyless message
BUG/MINOR: mux-h1: Fix test to skip trailers from chunked messages
BUG/MINOR: http-act: fix a typo in a "del-heeaders-bin" error message
CLEANUP: tcpcheck: Fix some typos in comments
MINOR: tcpcheck: Rely on free_tcpcheck_ruleset() to deinit tcpchecks
BUG/MINOR: tcpcheck: Don't release ruleset when parsing 'spop-check'
ruleset
BUG/MINOR: tcpcheck: Fix a leak on deinit by releasing ruleset's conf.file
CLEANUP: haterm: Fix typos in comments
CLEANUP: config: Fix warning about invalid small buffer size
CLEANUP: htx: Fix typos in comments
CLEANUP: chunk: Fix a typo in a comment
CLEANUP: http-client: Fix typos in comments
BUG/MEDIUM: tcpcheck: Release temporary small chunk when retrying on
http-check
CLEANUP: proxy: Fix typos in comments
DOC: config: Fix a typo for "external-check" directive
CLEANUP: cli: Fix typos in comments
BUG/MINOR: stream: Add SF_TXN_HTTP/SF_TXN_PCLI flags in strm_show_flags()
REGTESTS: Never reuse server connection in jwt/jws_verify.vtc
REGTESTS: Never reuse server connection in
server/cli_delete_dynamic_server.vtc
BUG/MEDIUM: mux-h1: Force close mode for bodyless message announcing a C-L
DOC: config: Fix log-format example with last rule expressions
DOC: config: Fix typo in tune.bufsize.large description
BUG/MAJOR: http-htx: Store new host in a chunk for scheme-based
normalization
BUG/MEDIUM: http-htx: Don't use data from HTX message to update authority
BUG/MEDIUM: http-htx: Loop on full host value during scheme based
normalization
MEDIUM: http-htx: Make authority update optional when replacing a header
value
MEDIUM: http-htx: Make authority update optional when adding a header
BUG/MAJOR: http: forbid comma character in authority value
BUG/MEDIUM: h1: Enforce the authority validation during H1 request parsing
BUG/MAJOR: mux-h1: Deal with true 64-bits integer to emit chunks size
BUG/MEDIUM: mux-fcgi: Properly handle full buffer for FCGI_PARAM record
BUG/MINOR: http-htx: Don't normalize emtpy path for OPTIONS requests
Daniel Lenar (1):
BUG/MINOR: tcpcheck: Allow connection reuse without prior traffic
Emeric Brun (1):
BUG/MAJOR: net_helper: ip.fp infinite loop on malformed tcp options
Ilia Shipitsin (6):
CI: github: do not install pcre-devel on Fedora Rawhide build
reg-tests/ssl/ssl_dh.vtc: fix syntax error
ci: modernize actions/upload-artifact@v4
BUG/MINOR: reg-tests: make shell syntax errors fatal
BUG/MINOR: ssl: fix memory leaks on realloc failure in ssl_ckch.c
BUG/MINOR: ssl: fix memory leaks on realloc failure in ssl_sock.c
Maxime Henrion (3):
MINOR: lb: infrastructure for declarative initialization
MEDIUM: lb: use the LB ops tables
MINOR: lb: cleanups
Miroslav Zagorac (7):
MINOR: otel: added debug thread ID support for the OTel C wrapper library
MINOR: otel: test: added option parsing to the speed test script
MINOR: otel: test: replaced argument variables with positional parameters
in run scripts
CLEANUP: otel: removed insecure-fork-wanted requirement
MINOR: otel: test: unified run scripts into a single symlinked script
MEDIUM: ot: emitted deprecation warning at filter init
BUILD: ot: emitted deprecation warning at build time
Olivier Houchard (6):
BUG/MEDIUM: checks: Don't forget to set the "alt_proto" field
BUG/MEDIUM: tasks: Make sure we don't schedule a task already running
BUG/MINOR: h2: make tune.h2.log-errors actually work
BUG/MINOR: h2: Don't look at the exclusive bit for PRIORITY frame
BUG/MINOR: H2: Don't forget to free shared_rx_bufs on failure
BUG/MEDIUM: tasks: Do not loop in task_schedule() if a task is running
Pierre Cheynier (1):
MINOR: sample: converter for frontend existence check
Tim Duesterhus (4):
CI: Build halog as part of contrib.yml
CLEANUP: Reapply ist.cocci (4)
CLEANUP: Reapply strcmp.cocci (3)
CLEANUP: Reapply ha_free.cocci (2)
William Lallemand (14):
CI: github: merge Test and Test-musl in VTest.yml
CI: github: revert quictls version on cross-zoo.yml
CI: github: use quictls-3.1.7 for cross-zoo.yml
BUILD: ssl/sample: potential null pointer dereference in sample_conv_aes
CI: github: add an i686 job in cross-zoo.yml
CI: github: run cross-zoo.yml weekly
CI: github: add cross-zoo.yml in README.md
CI: github: fix sysctl in fedora-rawhide
CI: github: switch to USE_PCRE2 in Fedora Rawhide build
MINOR: acme: implement draft-ietf-acme-profiles
MINOR: acme: allow IP SAN in certificate request
CI: github: add an i686 job to the push job
REGTESTS: ssl: mark ssl_dh.vtc as broken
BUILD: 51d: fix bool definition on dummy lib v4
Willy Tarreau (48):
DOC: config: fix spelling of "max-threads-per-group" in the index
MEDIUM: threads: change the default max-threads-per-group value to 16
BUG/MEDIUM: mux-h2: ignore conn->owner when deciding if a connection is
dead
BUILD: haterm: don't pass size_t to %lu in error messages
BUG/MINOR: log: consider format expression dependencies to decide when to
log
MINOR: sample: make RQ/RS stats available everywhere
BUG/MINOR: sample: adjust dependencies for channel output bytes counters
MEDIUM: muxes: always set conn->owner to the session that owns the
connection
MEDIUM: session: always reset the conn->owner on backend when installing
mux
CLEANUP: mux-h1: avoid using conn->owner in uncertain areas
CLEANUP: mux-h1: remove the unneeded test on conn->owner in
h1s_finish_detach()
BUG/MAJOR: sched: protect task->expire on 32-bit platforms
BUILD: config: also set DEF_MAX_THREADS_PER_GROUP when not using threads
BUG/MINOR: mux-h2: count a protocol error when failing to parse a trailer
BUG/MINOR: mux-h2: count a proto error when rejecting a stream on parsing
error
BUG/MINOR: log: also wait for the response when logging response headers
BUG/MINOR: compression: properly disable request when setting response
BUG/MINOR: servers: fix last_sess date calculation
DOC: config: fix typo introduce in max-threads-per-group documentation
BUG/MINOR: stream: add the newly added SF_TXN_* flags to strm_show_flags()
BUG/MINOR: debug: properly mark the entire libs archive read-only
Revert "BUG/MINOR: stream: add the newly added SF_TXN_* flags to
strm_show_flags()"
BUG/MINOR: server: fix a possible leak of an error message in dynamic
servers
BUG/MAJOR: mux-h2: detect incomplete transfers on HEADERS frames as well
BUG/MINOR: ssl: fix double-free on failed realloc in ssl_sock.c
BUG/MINOR: tree-wide: fix a few user-visible spelling mistakes from dev7
CLEANUP: tree-wide: address various spelling mistakes in comments from
-dev7
BUG/MINOR: tools: my_memspn/my_memcspn wrong cast causing incorrect byte
reading
BUG/MINOR: tools: fix memory leak in indent_msg() on out of memory
BUG/MINOR: tools: free previously allocated strings on strdup failure in
backup_env()
BUG/MINOR: sample: fix memory leak in check_when_cond() when ACL is not
found
BUG/MINOR: sample: fix memory leak in smp_resolve_args error paths
BUG/MINOR: sample: fix NULL strm dereference in sample_conv_when
BUG/MINOR: peers: fix logical "and" when checking for local in
PEER_APP_ST_STARTING
BUG/MINOR: peers: fix wrong flag reported twice for dump_flags
CLEANUP: peers: fix a few user-visible spelling mistakes
CLEANUP: tools: drop upper case check after tolower()
CLEANUP: mux-h2: remove duplicate forward declaration of
h2s_rxbuf_{head,tail}()
CLEANUP: tree-wide: fix around 20 mistakes in comments in h2,tools,peers
BUG/MEDIUM: mux_h1: fix stack buffer overflow in h1_append_chunk_size()
BUG/MINOR: http_ana: use scf to report term_evts in
http_wait_for_request()
BUG/MINOR: fix various typos and spelling mistakes in user-visible
messages
CLEANUP: tree-wide: fix comment typos all over the tree (~68)
BUG/MINOR: payload: validate minimum keyshare_len in
smp_fetch_ssl_keyshare_groups
BUG/MINOR: payload: prevent integer overflow in distcc token parsing
BUG/MINOR: net_helper: fix out-of-bounds read in tcp_fullhdr_find_opt
BUG/MINOR: net_helper: fix out-of-bounds read in
sample_conv_tcp_options_list
BUG/MINOR: net_helper: fix incomplete decoding in sample_conv_eth_vlan
---