]> git.kaiwu.me - haproxy.git/log
haproxy.git
8 days agoCLEANUP: resolvers: Remove duplicated line when resolvers proxy is initialized
Christopher Faulet [Mon, 4 May 2026 06:29:21 +0000 (08:29 +0200)]
CLEANUP: resolvers: Remove duplicated line when resolvers proxy is initialized

In resolvers_setup_proxy(), "px->conn_retries" was initialized twice. Let's
remove the line with no comment.

8 days agoBUG/MINOR: tcpcheck: Properly report error for http health-checks
Christopher Faulet [Mon, 4 May 2026 05:52:41 +0000 (07:52 +0200)]
BUG/MINOR: tcpcheck: Properly report error for http health-checks

When an error is reported on an expect rule for tcp and http health-checks,
a dedicated message is reported with details about the wrong match. However,
this was never performed for HTTP health-check because of the wrong test on
the check type.

In addition, when an error was reported on an "expect hdr" rule, a break
statement was missing. So the error message could be truncated (but never
emitted because of the issue above).

This patch should be backported to all stable versions.

8 days agoBUG/MINOR: dns: always validate the source address in responses
Willy Tarreau [Mon, 4 May 2026 14:10:20 +0000 (16:10 +0200)]
BUG/MINOR: dns: always validate the source address in responses

When we removed the use of connect() to reach DNS servers in 3.3 with
commit 2c7e05f80e ("MEDIUM: dns: don't call connect to dest socket for
AF_INET*"), we accidentally lost a check on the server's address in
responses, opening the possibility of spoofed DNS responses for someone
who knows both haproxy's IP:port and the transaction ID.

In practice, the impact is very low, because:
  - DNS servers IP addresses are almost always known, and often even among
    the widely used ones (1.1.1.1, 8.8.8.8 etc), and their port is 53.
  - all DNS "security" relies on the ignorance of the transaction ID and
    is possible source port, so if either the attacker is on-path and sees
    them, or it's off-path and has to guess them, but in any case it's
    trivial to spoof the known server in responses, with or without the
    check.

Regardless, let's not further weaken the protocol and do the check.

Thanks to Omkhar Arasaratnam for reporting this issue.

An interesting observation while testing this fix was that the code does
support UNIX dgram sockets (via connect()) but that since we don't bind
to a local UNIX socket to send requests, the server's recvfrom() doesn't
get any address and has nowhere to respond to. So in practice while the
code is designed to deal with UNIX sockets, these cannot work by design.

This fix must be backported to 3.2 where the commit above was backported.

8 days agoDOC: acme: document missing acme-vars and provider-name keywords
William Lallemand [Mon, 4 May 2026 12:40:20 +0000 (14:40 +0200)]
DOC: acme: document missing acme-vars and provider-name keywords

Both keywords are used with dns-01 and dns-persist-01 challenges to pass
information to an external DNS provisioning tool (e.g. the dataplaneAPI)
via the "dpapi" sink. provider-name sets the DNS provider identifier and
acme-vars passes arbitrary tool-specific variables.

Thanks to @oliwer for reporting the issue.

Must be backported to 3.2, however previous version don't have
"dns-persist-01".

8 days agoDOC: otel: update the filter's status and URL in the docs
Willy Tarreau [Mon, 4 May 2026 12:37:02 +0000 (14:37 +0200)]
DOC: otel: update the filter's status and URL in the docs

The docs (readme and configuration.txt) still used to mention that OTEL
was under development. Now that it's released, let's indicate that it's
ready with the download URL.

8 days agoBUG/MAJOR: mux-h2: preset MSGF_BODY_CL on H2_SF_DATA_CLEN in h2c_dec_hdrs()
Willy Tarreau [Mon, 4 May 2026 11:51:36 +0000 (13:51 +0200)]
BUG/MAJOR: mux-h2: preset MSGF_BODY_CL on H2_SF_DATA_CLEN in h2c_dec_hdrs()

Commit d12edebe4a ("BUG/MAJOR: mux-h2: detect incomplete transfers on
HEADERS frames as well") tried to enforce strict matching between
advertised content-length and transferred data when dealing with ES on
a headers frame. It purposely arranged the code so that it would cover
both headers and trailers. The problem is, in h2c_dec_hdrs() we preset
message flags (msgf) based on the current state and knowledge related
to the stream being processed, then we pass these flags to the headers
parser and use their final state to perform some extra checks.

MSGF_BODY_CL was set by the parsers themselves when processing a
content-length header, but when parsing a trailers frame, it will not
be set, and due to this the matching between the remaining expected
content-length and the transferred data is not verified, so the fix
above doesn't work for trailers.

This patch sets MSGF_BODY_CL to the same value as H2_SF_DATA_CLEN so
that during headers it remains zero, but it matches what was learned
during headers when processing trailers. It is sufficient to re-enable
the check that was attempted in the commit above.

The impact remains the same as the one indicated in the commit above: in
practice this can be used to force subsequent requests to fail, or when
running with "http-reuse never" or when running with a totally idle server,
to perform a request smuggling by constructing specially crafted request
pairs where the first one is used to trigger an early response and hide
parts of or all headers of the second one, to instead use a second
embedded one that was not subject to analysis. As such, the risk remains
moderate given the low prevalence of "http-reuse never" in production
environments, and of idle servers. Again, a temporary alternative to the
fix is to disable HTTP/2 by specifying "alpn http/1.1" on "bind" lines,
and adding "option disable-h2-upgrade" in HTTP frontends.

Many thanks to Pratham Gupta / alchemy1729 for spotting and analyzing
this problem, and for providing a lightweight reproducer to illustrate
the problem!

This fix must be backported to all versions where the fix above was
backported (i.e. all). Note that it depends on this previous commit
otherwise trailers will always break:

  BUG/MEDIUM: mux-h2: fix the body_len to check when parsing request trailers

As a side note, it's worth noting that these temporary message flags have
reached a level of pain and fragility that really warrants a complete
rework. Ideally we should have a pair of such flags in the h2s (one per
direction) and the callers of the parsers should point to them so that
they are always up to date. And by having generic HTTP flags instead of
H2, we could better unify the h1/h2/h3/fcgi processors (and maybe avoid
some HTX conversion). One flag could even indicate that trailers are
being parsed (since they're last) so as to ease this detection down the
chain.

8 days agoBUG/MEDIUM: mux-h2: fix the body_len to check when parsing request trailers
Willy Tarreau [Mon, 4 May 2026 11:42:52 +0000 (13:42 +0200)]
BUG/MEDIUM: mux-h2: fix the body_len to check when parsing request trailers

The h2 content-length validation in commit d12edebe4a ("BUG/MAJOR:
mux-h2: detect incomplete transfers on HEADERS frames as well") was
insufficient. The content-length check is still ineffective on request
trailers and it could not work by default due to the fact that the
default body_len is used in h2c_frt_handle_headers() when processing
trailers, instead of passing h2s->body_len, which was necessarily parsed
before reaching trailers. Let's fix this point first, otherwise fixing
the second issue would break trailers.

Many thanks to Pratham Gupta / alchemy1729 for spotting and analyzing
this problem, and for providing a lightweight reproducer to illustrate
the problem!

This fix must be backported to all versions where the fix above was
backported (i.e. all).

8 days agoCLEANUP: otel: move opentelemetry outside haproxy sources
William Lallemand [Mon, 4 May 2026 12:18:40 +0000 (14:18 +0200)]
CLEANUP: otel: move opentelemetry outside haproxy sources

The opentelemetry addons now live outside haproxy sources and is
available at https://github.com/haproxytech/haproxy-opentelemetry/

The addon must be built using the EXTRA_MAKE option from HAProxy
Makefile:

$ PKG_CONFIG_PATH=/opt/lib/pkgconfig make -j8 TARGET=linux-glibc
  EXTRA_MAKE="/tmp/a/a/haproxy-opentelemetry" OTEL_DEBUG=1 OTEL_USE_VARS=1

8 days agoBUILD: otel: removed USE_OTEL, addon is now built via EXTRA_MAKE
Miroslav Zagorac [Mon, 4 May 2026 09:45:52 +0000 (11:45 +0200)]
BUILD: otel: removed USE_OTEL, addon is now built via EXTRA_MAKE

The OpenTelemetry filter has been moved out of the haproxy source tree and
now lives and is developed in the haproxy-opentelemetry repository as an
external addon.  Removed all hard-coded references to USE_OTEL and to the
addons/otel directory from the main Makefile, as the addon is now plugged
in through the generic EXTRA_MAKE hook added in the previous commit.

8 days agoBUILD: add an EXTRA_MAKE option to build addons easily
William Lallemand [Thu, 30 Apr 2026 16:27:27 +0000 (18:27 +0200)]
BUILD: add an EXTRA_MAKE option to build addons easily

Allow to call an external Makefile called Makefile.inc in order to build
complex addons.

make TARGET=linux-glibc ... EXTRA_MAKE="/path/to/addon1" \
     EXTRA_MAKE+="/path/to/addon2"

8 days agoCLEANUP: mux-h2: remove the outdated condition to release h2c on timeout
Willy Tarreau [Mon, 4 May 2026 09:57:12 +0000 (11:57 +0200)]
CLEANUP: mux-h2: remove the outdated condition to release h2c on timeout

The historical code dealing with timeout was left with a confusing
condition that is always true but always requires some analysis. It
would check if some streams were left pending before deciding to
release the connection. It could indeed be problematic to leave with
no timeout and an active connection!

As Christopher figured, the situation cannot exist because a first
check ensures there's no more h2c via h2c_may_expire(), then a call
to h2_wake_some_streams() will call h2s_wake_one_stream() for each
of the h2s, and all those with no h2c are purged. Thus on return
from h2_wake_some_streams() we're guaranteed to have an empty tree.

Let's just remove the condition and clean up the code.

8 days agoMINOR: quic: fix trace spacing when datagram is displayed
Amaury Denoyelle [Mon, 4 May 2026 09:18:47 +0000 (11:18 +0200)]
MINOR: quic: fix trace spacing when datagram is displayed

Adjust spacing between individual arguments for the QUIC trace
QUIC_EV_CONN_RCV when a datagram is displayed.

8 days agoBUG/MINOR: quic: fix trace crash on datagram receive
Amaury Denoyelle [Mon, 4 May 2026 09:12:08 +0000 (11:12 +0200)]
BUG/MINOR: quic: fix trace crash on datagram receive

Recently, datagram reception architecture has been completely reworked
to improve performance. A regression has been introduced when using
traces in qc_rcv_buf() : datagram argument is uninitialized after recv
syscall. This may cause a crash as CIDs buffer is dereferenced.

Fix this by removing dgram argument from the affected trace. A new trace
is added after quic_dgram_init() to keep the ability to display the
received content.

This issue has caused failure of all QUIC interop testing.

No need to backport.

8 days agoBUG/MEDIUM: acme: fix stalled renewal when opportunistic DNS check fails
William Lallemand [Thu, 30 Apr 2026 18:24:59 +0000 (20:24 +0200)]
BUG/MEDIUM: acme: fix stalled renewal when opportunistic DNS check fails

In ACME_INITIAL_RSLV_READY, when the opportunistic DNS propagation check
fails and the code falls back to ACME_CLI_WAIT, ACME_RDY_INITIAL_DNS was
left set in cond_ready. Since the CLI-wait path only ever sets ACME_RDY_CLI
on auth->ready, the readiness check in ACME_CLI_WAIT could never be
satisfied, permanently stalling certificate renewal.

Fix this by stripping ACME_RDY_INITIAL_DNS from cond_ready before falling
back to the regular CLI-wait flow. Also replace the &= with a plain
assignment in the success path to make the intent explicit.

No backport needed, 3.4 only.

8 days agoBUG/MINOR: quic: fix buffer overflow with sockaddr_in46
Amaury Denoyelle [Mon, 4 May 2026 08:22:42 +0000 (10:22 +0200)]
BUG/MINOR: quic: fix buffer overflow with sockaddr_in46

New type sockaddr_in46 has been recently introduced. It serves as a
union which can store either an IPv4 or IPv6 address. The objective is
to reduce the storage size for QUIC datagrams which previously uses a
sockaddr_storage field.

On qc_new_conn(), source and destination addresses from the datagram are
passed to the function as sockaddr_storage so that they are copied into
the newly built quic_conn instance. However, the involved memcpy() is
producing a buffer overflow as sockaddr_in46 is smaller than
sockaddr_storage type.

This patch fixes this by defining a new helper function
in46un_to_addr(). This allows to convert safely sockaddr_in46 to a plain
sockaddr type. The function is now used before invoking qc_new_conn().

Note that there is still other several places where union sockaddr_in46
is casted as sockaddr_storage type. However, these should be safe as in
these cases sockaddr fields are accessed individually after checking
ss_family. The memory issue only exists when plain memcpy is used.

This bug was detected using ASAN. It generates the following traces when
a QUIC connection is instantiated.

==37474==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x7c3bb9a61100 at pc 0x5631f52c3946 bp 0x7ffc83e45b50 sp 0x7ffc83e45310
READ of size 128 at 0x7c3bb9a61100 thread T0
    #0 0x5631f52c3945 in __asan_memcpy (/home/amaury/work/haproxy-quic-dev/haproxy+0x3ae945) (BuildId: a7ccfd74b7a71a869b8ff8d13f6dcde8c82c1487)
    #1 0x5631f55f9e34 in qc_new_conn /home/amaury/work/haproxy-quic-dev/src/quic_conn.c:1311:2
    #2 0x5631f558d5c3 in quic_rx_pkt_retrieve_conn /home/amaury/work/haproxy-quic-dev/src/quic_rx.c:1875:10
    #3 0x5631f558330b in quic_dgram_parse /home/amaury/work/haproxy-quic-dev/src/quic_rx.c:2463:29
    #4 0x5631f5625da6 in quic_lstnr_dghdlr /home/amaury/work/haproxy-quic-dev/src/quic_sock.c:206:3
    #5 0x5631f6a64173 in run_tasks_from_lists /home/amaury/work/haproxy-quic-dev/src/task.c:660:26
    #6 0x5631f6a6ba1e in process_runnable_tasks /home/amaury/work/haproxy-quic-dev/src/task.c:913:9
    #7 0x5631f5e984c3 in run_poll_loop /home/amaury/work/haproxy-quic-dev/src/haproxy.c:2982:3
    #8 0x5631f5e9a715 in run_thread_poll_loop /home/amaury/work/haproxy-quic-dev/src/haproxy.c:3212:2
    #9 0x5631f5e9f732 in main /home/amaury/work/haproxy-quic-dev/src/haproxy.c:3853:2
    #10 0x7f2bba8276c0  (/usr/lib/libc.so.6+0x276c0) (BuildId: ca0db5ab57a36507d61bbcf4988d344974331f19)
    #11 0x7f2bba8277f8 in __libc_start_main (/usr/lib/libc.so.6+0x277f8) (BuildId: ca0db5ab57a36507d61bbcf4988d344974331f19)
    #12 0x5631f51be594 in _start (/home/amaury/work/haproxy-quic-dev/haproxy+0x2a9594) (BuildId: a7ccfd74b7a71a869b8ff8d13f6dcde8c82c1487)

No need to backport.

12 days agoCI: github: add DEBUG_STRICT=2 to ASAN jobs
William Lallemand [Thu, 30 Apr 2026 15:24:55 +0000 (17:24 +0200)]
CI: github: add DEBUG_STRICT=2 to ASAN jobs

Add an DEBUG_STRICT=2 option to the ASAN jobs in order to trigger the
BUG_ON_HOT() conditions.

12 days agoCLEANUP: acl: remove duplicate test in parse_acl_expr() and unused variable
Willy Tarreau [Thu, 30 Apr 2026 13:53:21 +0000 (15:53 +0200)]
CLEANUP: acl: remove duplicate test in parse_acl_expr() and unused variable

aclkw->match_type was compared twice to PAT_MATCH_DOM in parse_acl_expr().
After auditing the involved types, it's only a copy-paste mistake, as no
other matching method is missing, so let's drop it to avoid the confusion.
Also drop variable ckw which is assigned NULL and passed to free(), and is
clearly a leftover from a previous version.

No backport needed.

12 days agoBUG/MINOR: pattern: release the reference on failure to load from file
Willy Tarreau [Thu, 30 Apr 2026 14:27:36 +0000 (16:27 +0200)]
BUG/MINOR: pattern: release the reference on failure to load from file

In pattern_read_from_file(), in case of failure to load from the file,
the newly allocated reference remains attached to the list and is never
freed. Let's just do it.

This can be backported to all versions since it arrived in 1.5 with
commit 1e00d3853b ("MAJOR: pattern/map: Extends the map edition system
in the patterns").

12 days agoCLEANUP: map/cli: fix some map-related help messages
Willy Tarreau [Thu, 30 Apr 2026 13:11:28 +0000 (15:11 +0200)]
CLEANUP: map/cli: fix some map-related help messages

Some CLI help messages used to mention "acl" instead of "map", others had
unbalanced brackets. This can be backported if desired.

12 days agoBUG/MINOR: map: do not leak a map descriptor on load error
Willy Tarreau [Thu, 30 Apr 2026 13:09:20 +0000 (15:09 +0200)]
BUG/MINOR: map: do not leak a map descriptor on load error

Maps can leak a map descriptor in sample_load_map() on error. This is
harmless since the process won't start after this, and this cannot be
used at run time. but it's cleaner to fix it. This can be backported.

12 days agoBUG/MINOR: acl: fix a possible arg corruption in smp_fetch_acl_parse()
Willy Tarreau [Thu, 30 Apr 2026 13:40:52 +0000 (15:40 +0200)]
BUG/MINOR: acl: fix a possible arg corruption in smp_fetch_acl_parse()

smp_fetch_acl_parse() first places the newly allocated ACL sample into
the first argument to be parsed, *before* parsing it. The type is not
changed so the first argument remains of type string. In case of error,
the allocated sample is released and release_sample_expr() will call
release_sample_arg() to release the argument, possibly freeing the
string present there. And here's the catch: by overwriting the first
arguments's ->ptr entry, it happens to be located over the ->str.size
location, to not be null and to still be freed, but by pure chance
thanks to aliasing. A slight reorder of the args or buffer fields
could place it in the ->area and provoke a double-free, or even always
make the first argument's parsing fail.

Let's move the assignment after the loop has succeeded instead, and
properly set type=ARGT_PTR so that we never try to free it. The bug
appeared with the "acl()" sample fetch in 2.9 with commit 7fccccccea
("MINOR: acl: add acl() sample fetch") so it can be backported to 3.0.

12 days agoMINOR: h3/hq_interop: implement stream reset on shut abort/kill-conn
Amaury Denoyelle [Tue, 21 Apr 2026 12:58:53 +0000 (14:58 +0200)]
MINOR: h3/hq_interop: implement stream reset on shut abort/kill-conn

Adjust QUIC mux stream shut procedure when abort or kill-conn is
performed. Changes are implemented directly into lclose callback for
h3/h09 protocols.

On abort, the stream is resetted as previously. The only change is that
now a proper error code can be used, with REQUEST_CANCELLED specified
for HTTP/3 protocol.

Kill-conn is requested when a tcp-requect connection reject rule has
been executed. In this case the stream is resetted, and the connection
is also closed. This is identical to the H2 multiplexer. HTTP/3 protocol
uses EXCESSIVE_LOAD as error code in this case.

12 days agoMEDIUM: mux-quic: extend shut to app proto layer
Amaury Denoyelle [Tue, 21 Apr 2026 12:58:17 +0000 (14:58 +0200)]
MEDIUM: mux-quic: extend shut to app proto layer

Previously, shut callback was entirely implemented in QUIC mux layer.
However, this operation depends on the above application protocol, as it
may define its own closure procedure and error codes. This is the case
notably with HTTP/3 specification.

This patch defines a stream shut API between QUIC mux and application
protocol layers via the new qcc_app_ops callback lclose(). The closure
reason is specified via an enum argument. Application protcol can then
perform the stream closure as intended.

This patch is only an architecture adjustment but should not have any
functional impact. Stream closure logic was moved identically from QUIC
mux into h3 and h09 lclose callback.

12 days agoBUG/MEDIUM: cli: fix master CLI connection slot leak on client disconnect
Alexander Stephan [Thu, 30 Apr 2026 14:23:52 +0000 (14:23 +0000)]
BUG/MEDIUM: cli: fix master CLI connection slot leak on client disconnect

In master-worker mode the master CLI proxy (mworker_proxy) has a
hardcoded maxconn of 10. When a client connects to the master CLI
socket and issues a command that gets forwarded to an unresponsive
worker (e.g. one that is stuck or very slow), the connection hangs
waiting for the worker's response. If the client then disconnects
(timeout, Ctrl-C, etc.), the connection slot is never released because
the client-side FIN is never acknowledged by the unresponsive worker.

After 10 such leaked slots the master CLI socket becomes completely
unreachable, returning "Resource temporarily unavailable" to any new
connection attempt. In containerized deployments this means readiness
probes start failing and the pod gets restarted.

The fix adds a timeout server-fin of 1s to the mworker_proxy. When
the client disconnects while waiting for a worker response, this
timeout ensures the dangling backend connection is cleaned up after
1s, freeing the connection slot. This does not affect normal CLI
operations since the timeout only starts after the client has already
closed its side of the connection.

A regression test is included that blocks the worker CLI thread using
"debug dev delay" with nbthread 1, fills all 10 master CLI slots,
waits for client-side timeouts, then verifies a new connection still
succeeds.

This fixes GH issue #3351.

This should be backported to all stable branches.

Co-authored-by: Martin Strenge <github@trixer.net>
Co-authored-by: William Lallemand <wlallemand@haproxy.com>
12 days agoBUG/MINOR: quic: handle cases where we don't have an address
Maxime Henrion [Thu, 30 Apr 2026 14:47:20 +0000 (10:47 -0400)]
BUG/MINOR: quic: handle cases where we don't have an address

It is possible to not have addresses in certain conditions, so we now
also allow the address family to be AF_UNSPEC in quic_dgram_init().

No backport necessary since this code is not yet in a release.

12 days agoOPTIM: quic: reduce the size of struct quic_dgram
Maxime Henrion [Tue, 21 Apr 2026 19:25:58 +0000 (15:25 -0400)]
OPTIM: quic: reduce the size of struct quic_dgram

The QUIC code can only handle IPv4 or IPv6 addresses, so using two
sockaddr_storage structs wastes a lot of space in the quic_dgram struct.
This is a very large overhead since this structure is written in the MPSC
ring buffers before every datagram, while many of those datagrams are only
50 bytes or less. Using an union instead saves 200 bytes per datagram,
increasing the capacity of the buffers significantly.

12 days agoMINOR: quic: store the DCID as an offset
Maxime Henrion [Mon, 23 Mar 2026 14:31:53 +0000 (10:31 -0400)]
MINOR: quic: store the DCID as an offset

Using an offset instead of a pointer into the datagram buffer is less
error-prone as we do not have to manually fixup that pointer when the
datagram is moved somewhere else in memory.

12 days agoOPTIM: quic: rework the QUIC RX code
Maxime Henrion [Fri, 30 Jan 2026 16:39:04 +0000 (11:39 -0500)]
OPTIM: quic: rework the QUIC RX code

Use an MPSC ring buffer to hold data for each datagram handler. Holding
this data in a per-handler buffer avoids the HoL blocking we experienced
when we had per-listener buffers with data from all threads mixed up
in them.

This also gets rid of the mt_list contention we were suffering before,
that was causing some threads to be stuck for a significant amount of
time, causing warnings and even crashes in some cases.

12 days agoMINOR: add an MPSC ring buffer implementation
Maxime Henrion [Mon, 23 Feb 2026 22:19:15 +0000 (17:19 -0500)]
MINOR: add an MPSC ring buffer implementation

This is to be used in the QUIC code, where the multiple producers are
the listener threads, and the single consumer is the datagram handler
thread. Entries are variable-length with a size header, and are kept
contiguous in the buffer, so padding is inserted at the end when an
entry would otherwise wrap around. The size field is overloaded to also
mark padding (-1) and entries that are still free or not yet ready for
reads (0).

Headers and payloads are aligned on 8 bytes. Aligning on 16 bytes might
be beneficial on some architectures to let memcpy() use 128-bit SIMD
instructions.

The head and tail offsets are 64-bit unsigned integers, making ABA
issues from integer overflow impossible on current or near-future
hardware. Reservation uses a CAS rather than FAA because of the need to
insert padding to keep entries contiguous.

12 days agoBUG/MINOR: hpack: validate idx > 0 in hpack_valid_idx()
Willy Tarreau [Tue, 28 Apr 2026 01:56:35 +0000 (03:56 +0200)]
BUG/MINOR: hpack: validate idx > 0 in hpack_valid_idx()

HPACK indices start at 1, so idx=0 is invalid. The function only checked
the upper bound before, allowing idx=0 to pass as valid. This is harmless
as the code properly checks for existing name and values everywhere, but
then due to the call to hpack_idx_to_phdr(), index 0 will be taken for
:authority. Let's just make sure it's never zero.

This can be backported.

12 days agoBUG/MINOR: vars: only print first invalid char in fill_desc()
Willy Tarreau [Thu, 30 Apr 2026 07:19:53 +0000 (09:19 +0200)]
BUG/MINOR: vars: only print first invalid char in fill_desc()

The variable name is passed as (ptr,len) suggesting that certain callers
might not always have 0-terminated strings (e.g. when used in arguments
where closing parenthesis or commas might follow), the error message
carefully tries to designate the first invalid character, yet by mistake
it prints the whole string. This mistake has been there since commit
4834bc773c ("MEDIUM: vars: adds support of variables") in 1.6. Let's
properly report the char as promised instead. This could be backported
but is totally unimportant.

12 days agoBUG/MINOR: vars: don't store the variable twice with set-var-fmt
Willy Tarreau [Thu, 30 Apr 2026 06:48:35 +0000 (08:48 +0200)]
BUG/MINOR: vars: don't store the variable twice with set-var-fmt

In 2.5, commit 9a621ae76d ("MEDIUM: vars: add a new "set-var-fmt" action")
introduced the set-var-fmt action. However the storage (by then
sample_store_stream() now var_set()) was added for this specific
branch without any return, leaving the sample copied again over the
variable via the final call, meaning that the variable name is looked
up twice and for proc scope, the lock is taken twice for each call to
set-var-fmt.

This patch removes the first call. Tests show that proc operations
now jump from 1.1M to 1.67M/s on a 64-core CPU (lower lock contention),
while other scopes only observe a modest improvement with few vars
(10 goes from 43.3M to 44M/s). This could be backported.

12 days agoBUG/MINOR: vars: make parse_store() return error on var_set() failure
Willy Tarreau [Tue, 28 Apr 2026 01:24:07 +0000 (03:24 +0200)]
BUG/MINOR: vars: make parse_store() return error on var_set() failure

In 2.5, variables in the scope "proc" were pre-created with commit
df8eeb1619 ("MEDIUM: vars: pre-create parsed SCOPE_PROC variables as
permanent ones"). However one test on var_set() was copy-pasted from
vars_check_args() into parse_store(), and the former returns 0 on
error while for the latter it's a success. This means that some errors
on variables of scope "proc" (typically alloc failure) can be missed
at boot time, probably either making that variable invisible or causing
a crash during boot.

Let's return ACT_RET_PRS_ERR instead. This can be backported.

12 days agoCLEANUP: net_helper: fix incorrect const pointers in writev_n16()
Willy Tarreau [Thu, 30 Apr 2026 06:21:33 +0000 (08:21 +0200)]
CLEANUP: net_helper: fix incorrect const pointers in writev_n16()

It's interesting to see that output pointers p1 and p2 were declared
as const, and that thisremained unnoticed due to the explicit casts
to u8 when writing to them. The function is currently not used, but
better clean it up to avoid surprises.

12 days agoBUG/MINOR: sink: do not free existing sinks on allocation error
Willy Tarreau [Thu, 30 Apr 2026 05:58:23 +0000 (07:58 +0200)]
BUG/MINOR: sink: do not free existing sinks on allocation error

In 3.1 with commit 1bdf6e884a ("MEDIUM: sink: implement sink_find_early()")
sink creation started to support plugging to an existing sink and only
updating the description. However if the strdup() for the new description
failed, it would go down the error path releasing everything, while leaving
the released entry in the sink list and leaving other users still attached
to it.

Here we take a different approach, we first allocate the new description,
and release the old one on success, otherwise we leave the entry unchanged.
And we only release new sinks, not old ones. This way allocation errors
just do not change what is already referenced elsewhere, so that error
unrolling remains clean.

This remains of low importance anyway since it's only a case of boot
error aggravation. Not really needed to be backported.

13 days agoBUG/MINOR: acme: skip auth/challenge steps when newOrder returns a certificate
William Lallemand [Wed, 29 Apr 2026 16:10:07 +0000 (18:10 +0200)]
BUG/MINOR: acme: skip auth/challenge steps when newOrder returns a certificate

When an ACME server returns a certificate URL directly in the newOrder
response (order already validated), parse it and transition straight to
ACME_CERTIFICATE, bypassing the auth/challenge steps.

This needs to be backported to 3.2.

13 days agoBUG/MEDIUM: acme: fix segfault on newOrder with empty authorizations
William Lallemand [Wed, 29 Apr 2026 16:04:27 +0000 (18:04 +0200)]
BUG/MEDIUM: acme: fix segfault on newOrder with empty authorizations

When an ACME server returns a newOrder response with an empty
authorizations array (certificate already validated), ctx->auths
remains NULL. The state machine then transitions to ACME_AUTH which
immediately dereferences ctx->next_auth, causing a segfault.

Return an error from acme_res_neworder() so the caller retries.

This needs to be backported to 3.2.

13 days ago[RELEASE] Released version 3.4-dev10 v3.4-dev10
Willy Tarreau [Wed, 29 Apr 2026 13:51:32 +0000 (15:51 +0200)]
[RELEASE] Released version 3.4-dev10

Released version 3.4-dev10 with the following main changes :
    - 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
    - BUG/MINOR: task: fix uninitialised read in run_tasks_from_lists()
    - MINOR: compression: prefix compression oriented functions with "comp_"
    - 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
    - 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
    - BUILD: haterm: don't pass size_t to %lu in error messages
    - CI: github: merge Test and Test-musl in VTest.yml
    - CI: Build halog as part of contrib.yml
    - BUG/MINOR: xprt_qstrm: read record length in 64bits
    - BUG/MINOR: mux_quic: convert QCC rx.rlen to 64bits
    - CI: github: revert quictls version on cross-zoo.yml
    - BUG/MINOR: xprt_qstrm: reduce max record length check
    - 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
    - BUG/MEDIUM: checks: Don't forget to set the "alt_proto" field
    - CI: github: do not install pcre-devel on Fedora Rawhide build
    - 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
    - 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
    - CI: github: add an i686 job to the push job
    - BUILD: config: also set DEF_MAX_THREADS_PER_GROUP when not using threads
    - reg-tests/ssl/ssl_dh.vtc: fix syntax error
    - ci: modernize actions/upload-artifact@v4
    - BUG/MINOR: reg-tests: make shell syntax errors fatal
    - 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
    - REGTESTS: ssl: mark ssl_dh.vtc as broken
    - 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/MEDIUM: tasks: Make sure we don't schedule a task already running
    - BUG/MAJOR: net_helper: ip.fp infinite loop on malformed tcp options
    - 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/MINOR: log: also wait for the response when logging response headers
    - 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/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/MEDIUM: mux-h1: Force close mode for bodyless message announcing a C-L
    - 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/MINOR: tcpcheck: Allow connection reuse without prior traffic
    - MINOR: sample: converter for frontend existence check
    - BUG/MEDIUM: stats: fix crash on 'dump stats-file'
    - 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
    - BUG/MINOR: ssl: fix memory leak on realloc failure in acme.ips
    - DOC: config: Fix log-format example with last rule expressions
    - DOC: config: Fix typo in tune.bufsize.large description
    - MEDIUM: ot: emitted deprecation warning at filter init
    - BUILD: ot: emitted deprecation warning at build time
    - 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
    - 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
    - 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()
    - MINOR: lb: infrastructure for declarative initialization
    - MEDIUM: lb: use the LB ops tables
    - MINOR: lb: cleanups
    - MINOR: mux_quic: remove superfluous b_size() before b_alloc()
    - BUG/MINOR: mux_quic: free frames emitted with QMux
    - BUILD: 51d: fix bool definition on dummy lib v4
    - CLEANUP: Reapply ist.cocci (4)
    - CLEANUP: Reapply strcmp.cocci (3)
    - CLEANUP: Reapply ha_free.cocci (2)
    - 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: tasks: Do not loop in task_schedule() if a task is running
    - 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
    - BUG/MEDIUM: mux-fcgi: Properly handle full buffer for FCGI_PARAM record
    - BUG/MINOR: http-htx: Don't normalize emtpy path for OPTIONS requests

13 days agoBUG/MINOR: http-htx: Don't normalize emtpy path for OPTIONS requests
Christopher Faulet [Wed, 29 Apr 2026 13:20:50 +0000 (15:20 +0200)]
BUG/MINOR: http-htx: Don't normalize emtpy path for OPTIONS requests

When the scheme-based normalization is performed, an empty path is
normalized to "/". But as stated in RFC9110#4.2.3, this must not be applied
on OPTIONS requests.

So let's fix the issue by adding a test on the method.

Thanks to @zhanhb for the bug report and the analysis.

This patch should fix the issue #3352. It must be backported as far as 3.0.

13 days agoBUG/MEDIUM: mux-fcgi: Properly handle full buffer for FCGI_PARAM record
Christopher Faulet [Wed, 29 Apr 2026 11:21:28 +0000 (13:21 +0200)]
BUG/MEDIUM: mux-fcgi: Properly handle full buffer for FCGI_PARAM record

The function encoding and sending FCGI_PARAM records was reworked to
properly deal with full buffer. An error must be triggered only when the
parameters cannot be encoded while the mbuf is empty (or the free space is
greater than the max record size). Otherwise we must wait and retry later.

Before, an error was triggered on encoding error if any HTX block was
consumed, regarless the mbuf state. Now, blocks are removed on success
only. So we can wait for more space.

This patch should fix the issue #3346. It should be backported to all stable
versions.

13 days agoBUG/MINOR: net_helper: fix incomplete decoding in sample_conv_eth_vlan
Willy Tarreau [Wed, 29 Apr 2026 07:36:03 +0000 (09:36 +0200)]
BUG/MINOR: net_helper: fix incomplete decoding in sample_conv_eth_vlan

sample_conv_eth_vlan() reads the VLAN TCI at area[idx + 2] without
ensuring there are enough bytes. The original condition 'idx + 4 < data'
breaks when there IS room for more data, leading to an incomplete read
when trying to decode a VLAN ID.

This can be backported where this converter was backported.

13 days agoBUG/MINOR: net_helper: fix out-of-bounds read in sample_conv_tcp_options_list
Willy Tarreau [Wed, 29 Apr 2026 07:31:56 +0000 (09:31 +0200)]
BUG/MINOR: net_helper: fix out-of-bounds read in sample_conv_tcp_options_list

sample_conv_tcp_options_list() uses 'ofs + 1 <= len' to check bounds
before reading the option length field at area[ofs + 1]. When ofs + 1
equals len, this reads one byte past the valid buffer (valid indices are
0 to len-1).

This is the same bug pattern as tcp_fullhdr_find_opt() fixed previously,
and the impact is also almost inexistent.

13 days agoBUG/MINOR: net_helper: fix out-of-bounds read in tcp_fullhdr_find_opt
Willy Tarreau [Wed, 29 Apr 2026 07:31:27 +0000 (09:31 +0200)]
BUG/MINOR: net_helper: fix out-of-bounds read in tcp_fullhdr_find_opt

tcp_fullhdr_find_opt() reads smp->data.u.str.area[next + 1] without
checking that next + 1 < len. When the last byte of a TCP header's
options section (at index len - 1) contains an option type that is not
0 (EOL) and not 1 (NOP), the code reads one byte past the valid buffer,
which is an out-of-bounds read, which in practice is totally harmless
but should be fixed.

This can be backported where tcp_fullhdr_find_opt() was backported.

13 days agoBUG/MINOR: payload: prevent integer overflow in distcc token parsing
Willy Tarreau [Wed, 29 Apr 2026 07:19:57 +0000 (09:19 +0200)]
BUG/MINOR: payload: prevent integer overflow in distcc token parsing

In both smp_fetch_distcc_param() and smp_fetch_distcc_body(), the code
does "ofs += body" without checking if body is larger than the remaining
data. If a malicious distcc packet contains a token with a very large
body length (param value up to 0xFFFFFFFF), ofs could overflow and wrap
around to a small value, causing the next iteration's bounds check
"ofs + 12 > ci_data(chn)" to pass incorrectly.

This could lead to out-of-bounds reads or an infinite loop.

Given that this is only used in trusted environments, this is mostly
harmless. It can be backported to all stable versions.

13 days agoBUG/MINOR: payload: validate minimum keyshare_len in smp_fetch_ssl_keyshare_groups
Willy Tarreau [Wed, 29 Apr 2026 07:09:33 +0000 (09:09 +0200)]
BUG/MINOR: payload: validate minimum keyshare_len in smp_fetch_ssl_keyshare_groups

The keyshare extension parsing loop reads dataPointer[readPosition+2]
and dataPointer[readPosition+3] inside the loop body, requiring at least
4 bytes to be safe. However, keyshare_len was only validated as >= 2.

With keyshare_len == 2 or 3, the first loop iteration would read past
the end of the extension data, causing an out-of-bounds read which is
harmless in practice. We also need to make sure that the read position
stops 4 bytes before the end in order to read the 4 next bytes.

This can be backported to stable versions.

13 days agoCLEANUP: tree-wide: fix comment typos all over the tree (~68)
Willy Tarreau [Tue, 28 Apr 2026 01:43:22 +0000 (03:43 +0200)]
CLEANUP: tree-wide: fix comment typos all over the tree (~68)

This covers hpack, quic, h3, map, acl, pattern, tcpchecks, clienthello.
Only comments were touched, 100% harmless, no need to backport.

13 days agoBUG/MINOR: fix various typos and spelling mistakes in user-visible messages
Willy Tarreau [Tue, 28 Apr 2026 12:02:13 +0000 (14:02 +0200)]
BUG/MINOR: fix various typos and spelling mistakes in user-visible messages

A few typos like "not unhandled" in error messages, and some spelling
mistakes mostly in cfgparse error messages were fixed. One spelling
mistake in a function name was fixed as well (ssl_sock_chose_sni_ctx
renamed to ssl_sock_choose_sni_ctx). Those which apply may be worth
being backported.

13 days agoBUG/MEDIUM: tasks: Do not loop in task_schedule() if a task is running
Olivier Houchard [Wed, 29 Apr 2026 10:24:08 +0000 (12:24 +0200)]
BUG/MEDIUM: tasks: Do not loop in task_schedule() if a task is running

Commit 7e1cc0fcdbcace75a957a69fc8a4d991f7b30fdb made it so we'd loop in
task_schedule() if the task is currently running, so that we'd be sure
that the task would not overwrite the expire field. However,
task_schedule() may be called while a lock is held, and if the running
task attempts to acquire that lock, it will lead to a deadlock.
So instead, if the task is running, just wake it up, so that we're sure
that it will reschedule itself correctly, as it should do anyway. We
already do nothing if the task is in a run queue, so it is expected that
tasks do that, and if they do not, then it is a bug.

This should fix github issue #3350
This should be backported where 7e1cc0fcdbcace75a957a69fc8a4d991f7b30fdb
has been backported, which should be up to 2.8.

13 days agoBUG/MAJOR: mux-h1: Deal with true 64-bits integer to emit chunks size
Christopher Faulet [Tue, 28 Apr 2026 16:15:15 +0000 (18:15 +0200)]
BUG/MAJOR: mux-h1: Deal with true 64-bits integer to emit chunks size

Functions emitting chunks size are using size_t integer to do so. Depending
on the code path, these functions can be called using an unsigned long long
integer (h1m->curr_len for instance). On 64-bits architectures, there is no
issue. But on the 32-bits architecture, it is a problem. size_t are 32-bits
integer so the 64-bits parameter will be casted to a 32-bits integer. For
chunk size exceeding 4GB, the wrong size will be emitted.

To fix the issue, these functions are now using true 64-bits
integer. h1s_consume_kop() was also modified accordingly.

In addition, when a size_t is compared to a 64-bits integer, an explicit
cast is used to be sure the right type is used.

This patch must be backported as far as 3.0. It must be backported after
1ef74fc7c ("BUG/MEDIUM: mux_h1: fix stack buffer overflow in
h1_append_chunk_size()").

13 days agoBUG/MEDIUM: h1: Enforce the authority validation during H1 request parsing
Christopher Faulet [Tue, 28 Apr 2026 09:20:59 +0000 (11:20 +0200)]
BUG/MEDIUM: h1: Enforce the authority validation during H1 request parsing

When a H1 request was parsed, only a light validation was performed on the
URI, mainly because there was no distinction between the different parts of
the URI. So only characters in the range [0x21, 0x7e], excluding the "#" was
allowed.

To be consistant with the H2 and H3 parser, the authority is now validated,
using http_authority_has_forbidden_char() function.

This patch should be backported as far as 2.8. For previous verions,
http_authority_has_forbidden_char() function does not exist.

13 days agoBUG/MAJOR: http: forbid comma character in authority value
Christopher Faulet [Tue, 28 Apr 2026 07:37:34 +0000 (09:37 +0200)]
BUG/MAJOR: http: forbid comma character in authority value

Strictly speaking, the comma character in authority is allowed by RFC3986.
However, it is pretty ambiguous for Host header value because comma is also
the value separator for headers supporting multiple value. It is also very
unlikely to have comma in host header value or authority. So instead of
dealing with this case with all the risks of bugs that this entails, we've
decided to forbid the comma in authority and host header value during the
parsing. Concretely, only http_authority_has_forbidden_char() was updated.

The internal API was not updated to prevent comma to be inserted when the
host header value is updated for instance. But this should be so uncommon
that it is not really a concern.

This patch should be backported as far as 2.8. For previous verions,
http_authority_has_forbidden_char() function does not exist.

13 days agoMEDIUM: http-htx: Make authority update optional when adding a header
Christopher Faulet [Fri, 24 Apr 2026 09:35:08 +0000 (11:35 +0200)]
MEDIUM: http-htx: Make authority update optional when adding a header

This patch is similar to the previous one but for header addtion. It is now
possible to skip the authority updated. An extra argument was added to
http_add_header() function for this purpose.

13 days agoMEDIUM: http-htx: Make authority update optional when replacing a header value
Christopher Faulet [Fri, 24 Apr 2026 09:15:27 +0000 (11:15 +0200)]
MEDIUM: http-htx: Make authority update optional when replacing a header value

When a header value is replaced, a test is performed to verify if the
authority must be updated or not. But there are some places where we know it
is useless. First, when the caller know the header is not the host
header. Then when the host header value is updated because the authority was
changed.

So now, an extra argument was added to http_replace_header() and
http_replace_header_value() functions to specify if the authority update
must be performed or not.

13 days agoBUG/MEDIUM: http-htx: Loop on full host value during scheme based normalization
Christopher Faulet [Tue, 28 Apr 2026 09:34:36 +0000 (11:34 +0200)]
BUG/MEDIUM: http-htx: Loop on full host value during scheme based normalization

During scheme based normalization, when the authority is normalized, the
host headers are updated accordingly. Only full host header values must be
updated. Comma-separated list are not expected here.

It is important to do so to be consistant with other places where the host
header is updated (when the request URI is changed for instance).

13 days agoBUG/MEDIUM: http-htx: Don't use data from HTX message to update authority
Christopher Faulet [Fri, 24 Apr 2026 09:06:16 +0000 (11:06 +0200)]
BUG/MEDIUM: http-htx: Don't use data from HTX message to update authority

When a host header value is updated, the authority can also be updated
accordingly. When it is performed, we must not use the new host header value
from the HTX message. Instead we must use the data passed as argument. It is
unexpected but the host header can have several comma-separated values.
Using the full header value can lead to unexpected result.

Note: having multiple comma-separated values for the host header should not
      be supported. The comma should be part of the host value. But it is
      quite ambiguous. This will be fixed in another commit.

This patch must be backported to all stable versions.

13 days agoBUG/MAJOR: http-htx: Store new host in a chunk for scheme-based normalization
Christopher Faulet [Fri, 24 Apr 2026 08:21:45 +0000 (10:21 +0200)]
BUG/MAJOR: http-htx: Store new host in a chunk for scheme-based normalization

During the scheme based normalization, The original authority value is used
to replace every host headers. It is an issue, because when the HTX message
is modified the blocks may be reorganised to find free space. For instance a
defragmentation can be performed. So the address of the authority can
change. To perform such rewrite, the new value must be stored in a temporary
buffer. It is especially important because the start-line is also updated,
so the original authority could be moved, making it invalid.

Because of this bug, it is possible to mix HTX block values. There is no
overflow but the start-line can be crushed with data from the host header
value, making it invalid for the server.

So, to fix the issue, the new host header value is now the one in the trash
chunk used to rewrite the start line. But in that case, the trash chunk must
be allocated to be sure it remains valid when replacing all host headers
values.

This patch must be backported as far as 2.6.

13 days agoCLEANUP: Reapply ha_free.cocci (2)
Tim Duesterhus [Tue, 28 Apr 2026 19:59:14 +0000 (21:59 +0200)]
CLEANUP: Reapply ha_free.cocci (2)

This reapplies ha_free.cocci across the whole src/ tree.

13 days agoCLEANUP: Reapply strcmp.cocci (3)
Tim Duesterhus [Tue, 28 Apr 2026 19:59:13 +0000 (21:59 +0200)]
CLEANUP: Reapply strcmp.cocci (3)

This reapplies strcmp.cocci across the whole src/ tree.

13 days agoCLEANUP: Reapply ist.cocci (4)
Tim Duesterhus [Tue, 28 Apr 2026 19:59:12 +0000 (21:59 +0200)]
CLEANUP: Reapply ist.cocci (4)

This reapplies ist.cocci across the whole src/ tree.

2 weeks agoBUILD: 51d: fix bool definition on dummy lib v4
William Lallemand [Tue, 28 Apr 2026 16:07:54 +0000 (18:07 +0200)]
BUILD: 51d: fix bool definition on dummy lib v4

Modern compiler breaks when defining bool, false and true.
Include <stdbool.h> instead.

$ make -j$(nproc) TARGET=linux-glibc USE_51DEGREES=1 \
   51DEGREES_VER=4 51DEGREES_SRC=addons/51degrees/dummy/v4hash/

2 weeks agoBUG/MINOR: mux_quic: free frames emitted with QMux
Amaury Denoyelle [Tue, 28 Apr 2026 09:02:23 +0000 (11:02 +0200)]
BUG/MINOR: mux_quic: free frames emitted with QMux

When using QUIC, mux instantiates quic_frame objects but does not free
them. This is performed only when acknowledgment are received.

This is not the case for QMux protocol, as the transport layer is much
simpler in this case. As such, mux is responsible to free up the frames
after emission.

This patch fixes qcc_qstrm_send_frames() by adding the necessary
qc_frm_free() calls as soon as a frame is emitted. This fixes a memory
leak. This function ensures that the freed object is removed from its
parent list, so LIST_DEL_INIT() is not necessary anymore.

No need to backport.

2 weeks agoMINOR: mux_quic: remove superfluous b_size() before b_alloc()
Amaury Denoyelle [Tue, 28 Apr 2026 08:40:05 +0000 (10:40 +0200)]
MINOR: mux_quic: remove superfluous b_size() before b_alloc()

b_alloc() does nothing if a buffer is already allocated. As such, it is
not necessary to call b_size() as a check prior to it. Removes its usage
in qcc_qstrm_recv() so that the code is similar to other b_alloc()
usages.

2 weeks agoMINOR: lb: cleanups
Maxime Henrion [Mon, 27 Apr 2026 19:29:22 +0000 (15:29 -0400)]
MINOR: lb: cleanups

Remove exports for functions that are not called directly anymore, and
make them static. This involves some reordering to avoid the need for a
forward static declaration.

Also remove the old callback fields from the lbprm struct.

2 weeks agoMEDIUM: lb: use the LB ops tables
Maxime Henrion [Mon, 27 Apr 2026 19:28:42 +0000 (15:28 -0400)]
MEDIUM: lb: use the LB ops tables

Remove manual initialization of the callbacks and use the ops field in
the lbprm struct to invoke those callbacks.

2 weeks agoMINOR: lb: infrastructure for declarative initialization
Maxime Henrion [Mon, 27 Apr 2026 18:26:18 +0000 (14:26 -0400)]
MINOR: lb: infrastructure for declarative initialization

This creates an ops structure for the various callbacks into the LB
algorithms, and defines those ops structure for each algorithm. A new
proxy_init callback is added for the initialization functions called
from proxy_finalize(). Since one of them needs to return an int in case
of an error, we change all the others to also return an int so we have a
uniform type.

No functional changes.

2 weeks agoBUG/MINOR: http_ana: use scf to report term_evts in http_wait_for_request()
Willy Tarreau [Sun, 26 Apr 2026 20:01:59 +0000 (22:01 +0200)]
BUG/MINOR: http_ana: use scf to report term_evts in http_wait_for_request()

http_wait_for_request() improperly reports term events on the scb instead
of scf, causing some request parsing failures to possibly be reported as
response errors. This was introduced in 3.2 with commit 2dc02f75b1 ("MEDIUM:
tevt/stconn/stream: Add dedicated termination events for stream location")
so it must be backported there.

2 weeks agoBUG/MEDIUM: mux_h1: fix stack buffer overflow in h1_append_chunk_size()
Willy Tarreau [Sun, 26 Apr 2026 11:51:16 +0000 (13:51 +0200)]
BUG/MEDIUM: mux_h1: fix stack buffer overflow in h1_append_chunk_size()

The char tmp[10] buffer can only hold 8 hex digits + CRLF suffix. If chksz
exceeds 4GB (0xFFFFFFFF), the do-while loop writes more than 8 hex digits,
overflowing the stack buffer by 1+ bytes. In practice the buffer is aligned
from the end and leaves a 6-byte hole before it on 64-bit systems, leaving
enough room to be harmless, and 4 on 32-bit platforms which save it from
touching lower variables. So it is safe but just by luck.

Fix by increasing tmp[] to 18 bytes, sufficient for up to 16 hex digits
(2^64 - 1) plus CRLF.

2 weeks agoMINOR: mux_quic/h3: report termination events at stream layer
Amaury Denoyelle [Mon, 27 Apr 2026 08:31:11 +0000 (10:31 +0200)]
MINOR: mux_quic/h3: report termination events at stream layer

This patch adds termination level on QUIC MUX at the stream layer.
Similarly to the previous patch, error codes should be similar to the
ones already used in H2.

Most of the values are reported via qcc_reset_stream() which have now an
extra argument for this. This is used by application protocol H3 and
hq-interop.

qmux_sctl() callback is extended to support MUX_SCTL_TEVTS to report the
current stream termination event at the upper layer.

2 weeks agoMINOR: mux_quic/h3: report termination events at connection level
Amaury Denoyelle [Mon, 20 Apr 2026 12:06:21 +0000 (14:06 +0200)]
MINOR: mux_quic/h3: report termination events at connection level

Implement termination event log in QUIC MUX layer at the connection
level. The objective is to reuse similar codes already used on H2.

Most of the error values are reported via qcc_set_error() which have now
an extra argument to specify the term event code. This is in particular
used in H3 application protocol code.

Also, qmux_ctl() now implements MUX_CTL_TEVTS to report the current
connection termination code to the upper layer. Callback qmux_sctl()
display the connection term event code on MUX_SCTL_DBG_STR.

2 weeks agoMINOR: mux_quic: display QCS sd on traces
Amaury Denoyelle [Mon, 27 Apr 2026 11:56:39 +0000 (13:56 +0200)]
MINOR: mux_quic: display QCS sd on traces

Add SD pointer and flags value when logging a QCS instance in
qmux_dump_qcs_info(). This changes output for bot htraces and
MUX_SCTL_DBG_STR.

2 weeks agoMINOR: mux_quic: return conn error code in debug string
Amaury Denoyelle [Mon, 20 Apr 2026 08:56:27 +0000 (10:56 +0200)]
MINOR: mux_quic: return conn error code in debug string

Similarly to H2, mux_quic now returns connection error code when stream
debug string is retrieved via MUX_SCTL_DBG_STR operation.

2 weeks agoCLEANUP: tree-wide: fix around 20 mistakes in comments in h2,tools,peers
Willy Tarreau [Sun, 26 Apr 2026 09:56:17 +0000 (11:56 +0200)]
CLEANUP: tree-wide: fix around 20 mistakes in comments in h2,tools,peers

This cleans up around 12 non-visible typos in h2 and mux-h2, 6 in peers,
3 in tools, and also addresses a leftover after commit 9294e8822f in 2.4
which changed the word fingerprint calculation without updating the
comment about the possible output values. No backport needed.

2 weeks agoCLEANUP: mux-h2: remove duplicate forward declaration of h2s_rxbuf_{head,tail}()
Willy Tarreau [Sun, 26 Apr 2026 09:52:41 +0000 (11:52 +0200)]
CLEANUP: mux-h2: remove duplicate forward declaration of h2s_rxbuf_{head,tail}()

These were strangely committed together with commit e4cb0ad632 ("MINOR:
mux-h2/traces: add buffer-related info to h2s and h2c").

2 weeks agoCLEANUP: tools: drop upper case check after tolower()
Willy Tarreau [Sun, 26 Apr 2026 20:47:21 +0000 (22:47 +0200)]
CLEANUP: tools: drop upper case check after tolower()

In update_word_fingerprint_with_len() we convert a character to lower
case, then it's checked against lower case, upper case and digits. Let's
just drop the upper case check which cannot happen.

2 weeks agoCLEANUP: peers: fix a few user-visible spelling mistakes
Willy Tarreau [Mon, 27 Apr 2026 12:34:59 +0000 (14:34 +0200)]
CLEANUP: peers: fix a few user-visible spelling mistakes

Just a few "leason" and "messafe" in traces. This can be backported.

2 weeks agoBUG/MINOR: peers: fix wrong flag reported twice for dump_flags
Willy Tarreau [Mon, 27 Apr 2026 12:32:36 +0000 (14:32 +0200)]
BUG/MINOR: peers: fix wrong flag reported twice for dump_flags

Flag PEERS_F_DBG_RESYNC_REMOTEASSIGN was missing and
PEERS_F_DBG_RESYNC_REMOTEABORT appeared twice instead, so the former
would not appear in flags dumps. This can be backported to 3.0.0.

2 weeks agoBUG/MINOR: peers: fix logical "and" when checking for local in PEER_APP_ST_STARTING
Willy Tarreau [Mon, 27 Apr 2026 12:30:45 +0000 (14:30 +0200)]
BUG/MINOR: peers: fix logical "and" when checking for local in PEER_APP_ST_STARTING

The expression to check both peer->local and appctx_is_back() uses a
bitwise '&' instead of a logical '&&'. Fortunately both values are
always either 0 or 1 so there is no impact. This can be backported to
all stable versions.

2 weeks agoBUG/MINOR: sample: fix NULL strm dereference in sample_conv_when
Willy Tarreau [Sun, 26 Apr 2026 21:56:00 +0000 (23:56 +0200)]
BUG/MINOR: sample: fix NULL strm dereference in sample_conv_when

Several cases in sample_conv_when (FORWARDED, TOAPPLET, PROCESSED, ACL)
access smp->strm->scb without checking if strm is NULL. The strm field
may be NULL (e.g., tcp-request connection). Let's add NULL checks to
prevent dereferencing a NULL pointer.

This should be backported to 3.1.

2 weeks agoBUG/MINOR: sample: fix memory leak in smp_resolve_args error paths
Willy Tarreau [Sun, 26 Apr 2026 21:55:03 +0000 (23:55 +0200)]
BUG/MINOR: sample: fix memory leak in smp_resolve_args error paths

Several error paths in smp_resolve_args used 'continue' which skipped
LIST_DELETE and free(cur), leaking the arg_list node. Changed all to
'break' to ensure proper cleanup on all error paths. This is harmless
since when such issues are met, the process refuses to start, so no
backport is really needed.

2 weeks agoBUG/MINOR: sample: fix memory leak in check_when_cond() when ACL is not found
Willy Tarreau [Sun, 26 Apr 2026 21:49:35 +0000 (23:49 +0200)]
BUG/MINOR: sample: fix memory leak in check_when_cond() when ACL is not found

When find_acl_by_name() and find_acl_default() both fail when parsing
converter "when(ACL,foo)", the previously allocated acl_sample struct
is leaked. Free it before returning 0. This can be backported to stable
versions.

2 weeks agoBUG/MINOR: tools: free previously allocated strings on strdup failure in backup_env()
Willy Tarreau [Sun, 26 Apr 2026 20:48:17 +0000 (22:48 +0200)]
BUG/MINOR: tools: free previously allocated strings on strdup failure in backup_env()

When strdup() fails after some entries have already been strdup'd, the function
returned -1 without freeing previously allocated strings. Added cleanup loop to
free all previously strdup'd entries and reset init_env.

This can be backported to 3.1.

2 weeks agoBUG/MINOR: tools: fix memory leak in indent_msg() on out of memory
Willy Tarreau [Sun, 26 Apr 2026 21:00:57 +0000 (23:00 +0200)]
BUG/MINOR: tools: fix memory leak in indent_msg() on out of memory

When malloc() fails in indent_msg, the function returned NULL without
freeing the original *out string as it was supposed to. The caller loses
both the original string (leaked) and gets NULL back. Fixed to free *out
and set it to NULL before returning.

2 weeks agoBUG/MINOR: tools: my_memspn/my_memcspn wrong cast causing incorrect byte reading
Willy Tarreau [Sun, 26 Apr 2026 21:00:38 +0000 (23:00 +0200)]
BUG/MINOR: tools: my_memspn/my_memcspn wrong cast causing incorrect byte reading

Both functions cast void * to int * and dereference, reading 4 bytes as an
integer instead of a single byte. This is passed to memchr() which expects a
byte value. On unaligned addresses this causes crashes on ARM/mips etc, and
search for the wrong byte on big endian platforms. Fixed to cast to
const unsigned char * and dereference a single byte. This is marked as
minor because these functions were added in 2.2 by commit 5eb96cbcbc
("MINOR: standard: Add my_memspn and my_memcspn") and have not been used
since then.

2 weeks agoCLEANUP: tree-wide: address various spelling mistakes in comments from -dev7
Willy Tarreau [Mon, 27 Apr 2026 07:34:03 +0000 (09:34 +0200)]
CLEANUP: tree-wide: address various spelling mistakes in comments from -dev7

These ones were found in recent patches merged since -dev7. There is no
user-visible change so no backport is needed.

2 weeks agoBUG/MINOR: tree-wide: fix a few user-visible spelling mistakes from dev7
Willy Tarreau [Mon, 27 Apr 2026 07:39:49 +0000 (09:39 +0200)]
BUG/MINOR: tree-wide: fix a few user-visible spelling mistakes from dev7

These spelling mistakes in documentation, traces or error messages
were introduced after -dev7. Some might possibly deserve being
backported.

2 weeks agoBUG/MINOR: ssl: fix double-free on failed realloc in ssl_sock.c
Willy Tarreau [Mon, 27 Apr 2026 06:38:31 +0000 (08:38 +0200)]
BUG/MINOR: ssl: fix double-free on failed realloc in ssl_sock.c

Recent commit 90bfbea7c0 ("BUG/MINOR: ssl: fix memory leaks on realloc
failure in ssl_sock.c") accidentally turned a memory leak in case of
allocation failure into a double-free: the original pointer must no
longer be released. In addition, the allocated_size has to be reset
in case of failure. This needs to be backported to 3.3 like previous
commit.

2 weeks agoBUILD: ot: emitted deprecation warning at build time
Miroslav Zagorac [Mon, 27 Apr 2026 06:15:33 +0000 (08:15 +0200)]
BUILD: ot: emitted deprecation warning at build time

Warn at Makefile parse time that the opentracing filter was deprecated
in haproxy 3.3 and will be removed in 3.5, complementing the runtime
warning emitted at filter init.

2 weeks agoMEDIUM: ot: emitted deprecation warning at filter init
Miroslav Zagorac [Mon, 27 Apr 2026 06:08:39 +0000 (08:08 +0200)]
MEDIUM: ot: emitted deprecation warning at filter init

The opentracing filter was deprecated in haproxy 3.3 and will be removed
in 3.5.  A warning is now issued during filter initialization, unless the
global 'expose-deprecated-directives' directive is set.  The notice is
emitted only once regardless of the number of filter instances.

2 weeks agoDOC: config: Fix typo in tune.bufsize.large description
Christopher Faulet [Mon, 27 Apr 2026 05:34:35 +0000 (07:34 +0200)]
DOC: config: Fix typo in tune.bufsize.large description

"butes" was used instead of "bytes".

Should fix the issue #3322.

2 weeks agoDOC: config: Fix log-format example with last rule expressions
Christopher Faulet [Mon, 27 Apr 2026 05:32:20 +0000 (07:32 +0200)]
DOC: config: Fix log-format example with last rule expressions

%[] were missing.

2 weeks agoBUG/MINOR: ssl: fix memory leak on realloc failure in acme.ips
BiancaDogareci [Sat, 25 Apr 2026 12:00:37 +0000 (15:00 +0300)]
BUG/MINOR: ssl: fix memory leak on realloc failure in acme.ips

Fix a realloc() bug in ckchs_dup() when copying the acme.ips array,
where overwriting the original pointer with NULL on allocation failure
loses reference to the original memory block.

Use my_realloc2() which safely handles the failure.

No backport needed.

2 weeks agoBUG/MINOR: ssl: fix memory leaks on realloc failure in ssl_sock.c
Ilia Shipitsin [Mon, 13 Apr 2026 16:14:51 +0000 (18:14 +0200)]
BUG/MINOR: ssl: fix memory leaks on realloc failure in ssl_sock.c

Replace bare realloc() calls with my_realloc2(), which frees the original
pointer on allocation failure, preventing a memory leak when the pointer
is subsequently overwritten with NULL.

Must be backported to 3.3.

2 weeks agoBUG/MINOR: ssl: fix memory leaks on realloc failure in ssl_ckch.c
Ilia Shipitsin [Mon, 13 Apr 2026 16:14:50 +0000 (18:14 +0200)]
BUG/MINOR: ssl: fix memory leaks on realloc failure in ssl_ckch.c

Replace bare realloc() calls with my_realloc2(), which frees the original
pointer on allocation failure, preventing a memory leak when the pointer
is subsequently overwritten with NULL.

Must be backported to 3.2.

2 weeks agoBUG/MEDIUM: stats: fix crash on 'dump stats-file'
Amaury Denoyelle [Fri, 24 Apr 2026 13:58:42 +0000 (15:58 +0200)]
BUG/MEDIUM: stats: fix crash on 'dump stats-file'

A crash occurs immediately when stats-file dump is requested by the
command-line. The issue is caused by the introduction of watchers when
iterating over the proxies list, which is now required with dynamic
backends.

  commit 20376c54e2166a0882b71b26326360786f79ebdb
  MINOR: stats: protect proxy iteration via watcher

The above patch initializes the new proxy watcher for stats dump and
HTML. However, this was forgotten for stats-file command context. Fix
this by adding the missing watcher_init() in cli_parse_show_stat().

No need to backport.

2 weeks agoMINOR: sample: converter for frontend existence check
Pierre Cheynier [Fri, 17 Apr 2026 07:37:14 +0000 (07:37 +0000)]
MINOR: sample: converter for frontend existence check

Introduced a new sample converter using keyword "fe_exists" checking if
a frontend with a given name exists.

2 weeks agoBUG/MINOR: tcpcheck: Allow connection reuse without prior traffic
Daniel Lenar [Sat, 18 Apr 2026 02:29:45 +0000 (21:29 -0500)]
BUG/MINOR: tcpcheck: Allow connection reuse without prior traffic

New connections created by tcpcheck for are marked as private, making
them ineligible for insertion into the server-side connection pool, even
when check-reuse-pool is activated. Thus, connection reuse for health
checks would only work when the pool had already been populated by
regular (non-check) traffic.

Change this behavior so that a new check connection is not flagged as
private anymore when check-reuse-pool is requested. As a result, on
detach, instead of being freed, the connection will be inserted in the
idle pool and will be eligible for reuse, both for regular traffic and
checks.

This change can be useful to ensure that a server idle pool is never
completely empty when check-reuse-pool is active. Additionnally, it is
also necessary to ensure that check reuse is really effective when
connection parameters are different between checks and regular traffic,
resulting in a different reuse hash.

The previous behavior could be considered as a bug to a certain extents.
The current patch should be harmless for default configuration, but it
can be a significant improvment for users who want to perform reuse for
checks. Thus, it should be backported up to 3.2.

2 weeks agoMINOR: mux_quic: handle incomplete QMux record read
Amaury Denoyelle [Thu, 23 Apr 2026 13:38:06 +0000 (15:38 +0200)]
MINOR: mux_quic: handle incomplete QMux record read

QMux implements a record layer which is used to encapsulate QUIC frames.

This patch implements reception of an incomplete record in
qcc_qstrm_recv(). BUG_ON() failures are removed and now reading will
continue until the whole record is received or a fatal error occurs.

Several adjustments were made in the logic for read operation.
Previously, read syscall was only performed if either data buffer was
empty or current record was incomplete. An extra condition is added to
perform read if there is data in the buffer but not enough to decode a
record header. Another change is that buffer realign is also performed
in this latter case and if buffer wrapping position has been reached.

2 weeks agoMINOR: mux_quic: handle conn errors on QMux without crash
Amaury Denoyelle [Thu, 23 Apr 2026 13:37:34 +0000 (15:37 +0200)]
MINOR: mux_quic: handle conn errors on QMux without crash

Remove BUG_ON() related to connection errors when invoking XPRT
snd_buf/rcv_buf in QMux operations. Such errors are now converted in
QC_CF_ERR_CONN flag, which will disable any I/O operations and close the
connection as soon as possible.

Note that this error management is pretty crude. In particular, it could
lead to truncated data when dealing with unidirectional connection
closure from the remote peer. However, it is considered sufficient for
now to continue interop testing without being disturbed by BUG_ON()
assertion crashes.

2 weeks agoMINOR: mux_quic: receive MAX_STREAMS_BIDI frames in QMux
Amaury Denoyelle [Thu, 23 Apr 2026 13:36:38 +0000 (15:36 +0200)]
MINOR: mux_quic: receive MAX_STREAMS_BIDI frames in QMux

Support reception via QMux of flow control MAX-STREAMS frame for
bidirectional streams. This is similar to the QUIC with shared
qcc_recv_max_streams() function.

2 weeks agoMINOR: mux_quic/xprt_qstrm: simplify Rx buffer transfer
Amaury Denoyelle [Thu, 23 Apr 2026 13:36:08 +0000 (15:36 +0200)]
MINOR: mux_quic/xprt_qstrm: simplify Rx buffer transfer

When xprt_qstrm layer is completed, MUX layer is started. Rx buffer from
the XPRT layer is transferred to the MUX so that it can handle any extra
data following the transport parameters first frame.

Since previous commit, QCC Rx buffer is dynamically allocated only when
needed. However, qmux_init() must still allocate it when there is data
to be transferred from the XPRT layer. As a result, code has been over
extended to continue to support this case.

This patch simplifies xprt_qstrm API for the Rx buffer transfer. Buffer
content and remaining record length can now be retrieved via the single
function xprt_qstrm_xfer_rxbuf(). If the buffer is empty, nothing is
performed and XPRT layer will release it. If not empty, MUX will take
ownership of the buffer from the XPRT layer.