]> git.ipfire.org Git - thirdparty/haproxy.git/log
thirdparty/haproxy.git
2 weeks agoMINOR: haterm: Add an request option to disable splicing
Christopher Faulet [Fri, 3 Apr 2026 08:26:37 +0000 (10:26 +0200)] 
MINOR: haterm: Add an request option to disable splicing

The parameter "?S=0" can now be added on the request URI to disable the
splicing for the response. "?S=1" will only fallback on the haterm settings.

2 weeks agoMINOR: haterm: Handle boolean request options as flags
Christopher Faulet [Fri, 3 Apr 2026 08:17:39 +0000 (10:17 +0200)] 
MINOR: haterm: Handle boolean request options as flags

Following request options are now handled as flags:

  - ?k=1 => flag HS_ST_OPT_CHUNK_RES is set
  - ?c=0 => flag HS_ST_OPT_NO_CACHE is set
  - ?R=1 => flag HS_ST_OPT_RANDOM_RES is set
  - ?A=A => flag HS_ST_OPT_REQ_AFTER_RES is set.

By default, none is set.

2 weeks agoMEDIUM: haterm: Add support for splicing and option to disable it
Christopher Faulet [Thu, 2 Apr 2026 19:47:12 +0000 (21:47 +0200)] 
MEDIUM: haterm: Add support for splicing and option to disable it

The support for the splicing was added and enabled by default, if
supported. The command line option '-dS' was also added to disable the
feature.

When the splicing can be used and the front multiplexer agrees to proceed,
tee() is used to "copy" data from the master pipe to the client pipe.

2 weeks agoMEDIUM: haterm: Prepare support for splicing by initializing a master pipe
Christopher Faulet [Thu, 2 Apr 2026 19:31:53 +0000 (21:31 +0200)] 
MEDIUM: haterm: Prepare support for splicing by initializing a master pipe

Now the zero-copy data forwarding is supported, we will add the splicing
support. To do so, we first create a master pipe with vmsplice() during
haterm startup. It is only performed if the splicing is supported. And its
size can be configured by setting "tune.pipesize" global parameter.

This master pipe will be used to fill the pipe with the client.

2 weeks agoMEDIUM: haterm: Add support for 0-copy data forwading and option to disable it
Christopher Faulet [Thu, 2 Apr 2026 19:44:05 +0000 (21:44 +0200)] 
MEDIUM: haterm: Add support for 0-copy data forwading and option to disable it

The support for the zero-copy data forwarding was added and enabled by
default. The command line option '-dZ' was also added to disable the
feature.

Concretely, when haterm pushes the response payload, if the zero-copy
forwarding is supported, a dedicated function is used to do so.
hstream_ff_snd() will rely on se_nego_ff() to know how many data can send
and at the end, on se_done_ff() to really send data.

hstream_add_ff_data() function was added to perform the raw copy of the
payload in the sedesc I/O buffer.

2 weeks agoMINOR: hasterm: Change hstream_add_data() to prepare zero-copy data forwarding
Christopher Faulet [Thu, 2 Apr 2026 19:40:31 +0000 (21:40 +0200)] 
MINOR: hasterm: Change hstream_add_data() to prepare zero-copy data forwarding

hstream_add_data() function is renamed to hstream_add_htx_data() because
there will be a similar function to add data in zero-copy forwarding
mode. The function was also adapted to take the data length to add in
parameter and to return the number of written bytes.

2 weeks agoMINOR: ssl: add the ssl_fc_crtname sample fetch
William Lallemand [Thu, 2 Apr 2026 21:34:50 +0000 (23:34 +0200)] 
MINOR: ssl: add the ssl_fc_crtname sample fetch

This new sample fetch returns the name of the certificate selected for
an incoming SSL/TLS connection, as it would appear in "show ssl cert".
It may be a filename with its relative or absolute path, or an alias,
depending on how the certificate was declared in the configuration.

The certificate name is stored as ex_data on the SSL_CTX at load time
in ckch_inst_new_load_store(), and freed via a dedicated free callback.

2 weeks agoBUG/MINOR: cfgcond: fail cleanly on missing argument for "feature"
Willy Tarreau [Fri, 3 Apr 2026 07:17:35 +0000 (09:17 +0200)] 
BUG/MINOR: cfgcond: fail cleanly on missing argument for "feature"

The "feature" predicate takes an argument name. Not passing one will
cause strstr() to always find something, including at the end of the
string, and to read past end that ASAN detects. We need to check that
we didn't reach end before proceeding.

This bug was reported by OSS Fuzz here:
   https://issues.oss-fuzz.com/issues/499133314

The issue is present since 2.4 with commit 58ca706e16 ("MINOR: config:
add predicate "feature" to detect certain built-in features") so this
fix must be backported to all stable versions.

2 weeks agoBUG/MINOR: cfgcond: always set the error string on awslc_api checks
Willy Tarreau [Fri, 3 Apr 2026 06:58:49 +0000 (08:58 +0200)] 
BUG/MINOR: cfgcond: always set the error string on awslc_api checks

Using awslc_api_before() with an invalid argument results in "(null)"
appearing in the error message due to -1 being returned without the
error message being filled. Let's always fill the error message on error.

This was introduced in 3.3 with commit 3d15c07ed0 ("MINOR: cfgcond: add
"awslc_api_atleast" and "awslc_api_before""), and this fix must be
backported to 3.3.

2 weeks agoBUG/MINOR: cfgcond: always set the error string on openssl_version checks
Willy Tarreau [Fri, 3 Apr 2026 06:56:54 +0000 (08:56 +0200)] 
BUG/MINOR: cfgcond: always set the error string on openssl_version checks

Using openssl_version_before() with an invalid argument results in "(null)"
appearing in the error message due to -1 being returned without the error
message being filled. Let's always fill the error message on error.

This was introduced in 2.5 with commit 3aeb3f9347 ("MINOR: cfgcond:
implements openssl_version_atleast and openssl_version_before"), and
this fix must be backported to 2.6.

2 weeks agoBUG/MINOR: cfgcond: properly set the error pointer on evaluation error
Willy Tarreau [Fri, 3 Apr 2026 06:51:02 +0000 (08:51 +0200)] 
BUG/MINOR: cfgcond: properly set the error pointer on evaluation error

cfg_eval_condition() says that the <errptr> pointer will be set upon
error. However, cfg_eval_cond_expr() can fail (e.g. failure to handle
a dynamic argument) but would branch to "done" and leave errptr unset.
Let's check for this case as well.

This bug was reported by OSS Fuzz here:
   https://issues.oss-fuzz.com/issues/499135825

The bug was introduced in 2.5 around commit ca81887599 ("MINOR:
cfgcond: insert an expression between the condition and the term") so
the fix must be backported as far as 2.6.

2 weeks agoMEDIUM: acme: split the initial delay from the retry DNS delay
William Lallemand [Thu, 2 Apr 2026 14:15:12 +0000 (16:15 +0200)] 
MEDIUM: acme: split the initial delay from the retry DNS delay

The previous ACME_RSLV_WAIT state served a dual role: it applied the
initial dns-delay before the first DNS probe and also handled the
delay between retries. There was no way to simply wait a fixed delay
before submitting the challenge without also triggering DNS pre-checks.

Replace ACME_RSLV_WAIT with two distinct states:
  - ACME_INITIAL_DELAY: an optional initial wait before proceeding,
    only applied when "challenge-ready" includes the new "delay" keyword
  - ACME_RSLV_RETRY_DELAY: the delay between resolution retries, always
    applied when DNS pre-checks are in progress

The new "delay" keyword in "challenge-ready" can be used standalone
(wait then submit the challenge directly) or combined with "dns" (wait
then start the DNS pre-checks). When "delay" is not set, the first DNS
probe fires immediately.

Update the documentation accordingly.

2 weeks agoMINOR: acme: remove remaining CLI wait in ACME_RSLV_TRIGGER
William Lallemand [Thu, 2 Apr 2026 16:23:35 +0000 (18:23 +0200)] 
MINOR: acme: remove remaining CLI wait in ACME_RSLV_TRIGGER

The TASK_WOKEN_TIMER check that previously handled the case where
RSLV_TRIGGER was reached directly from the CLI command is therefore dead
code and can be removed.

2 weeks agoBUG/MINOR: mux_quic: fix uninit for QMux emission
Amaury Denoyelle [Thu, 2 Apr 2026 14:54:27 +0000 (16:54 +0200)] 
BUG/MINOR: mux_quic: fix uninit for QMux emission

Fix the following build warning from obsolete compilers for <orig_frm>
variable in qcc_qstrm_send_frames() function :

src/mux_quic_qstrm.c:266:17: warning: 'orig_frm' may be used
  uninitialized in this function [-Wmaybe-uninitialized]

The variable is now explicitely initialized to NULL on each loop, which
should prevent this warning. Note that for code clarity, the variable is
renamed <next_frm>.

No need to backport.

2 weeks agoDEBUG: connection/flags: add QSTRM flags for the decoder
Amaury Denoyelle [Thu, 2 Apr 2026 14:21:40 +0000 (16:21 +0200)] 
DEBUG: connection/flags: add QSTRM flags for the decoder

Add new flags CO_FL_QSTRM_SEND and CO_FL_QSTRM_RECV in conn_show_flags()
so that they can be decoded by dev/flags/flags utility.

No backport needed.

2 weeks agoMEDIUM: acme: initialize the dns timer starting from the first DNS request
William Lallemand [Thu, 2 Apr 2026 13:45:47 +0000 (15:45 +0200)] 
MEDIUM: acme: initialize the dns timer starting from the first DNS request

Previously the dns timeout timer was initialized in ACME_RSLV_WAIT,
before the initial dns-delay expires. This meant the countdown started
before any DNS request was actually sent, so the effective timeout was
shorter than expected by one dns-delay period.

Move the initialization to ACME_RSLV_TRIGGER so the timer starts only
when the first DNS resolution attempt is triggered. Update the
documentation to clarify this behaviour.

2 weeks agoMINOR: acme: split the CLI wait from the resolve wait
William Lallemand [Thu, 2 Apr 2026 13:16:29 +0000 (15:16 +0200)] 
MINOR: acme: split the CLI wait from the resolve wait

Add a new state ACME_CLI_WAIT which allows to split the CLI wait logic
from the resolve wait logic.

2 weeks agoMAJOR: mux-quic: activate QMux on the backend side
Amaury Denoyelle [Thu, 26 Mar 2026 09:27:28 +0000 (10:27 +0100)] 
MAJOR: mux-quic: activate QMux on the backend side

During connect_server(), xprt_qstrm is selected to performed transport
parameters exchange prior to the mux layer initialization.

2 weeks agoMAJOR: mux-quic: activate QMux for frontend side
Amaury Denoyelle [Wed, 19 Feb 2025 14:01:58 +0000 (15:01 +0100)] 
MAJOR: mux-quic: activate QMux for frontend side

To be able to support QMux protocol, xprt_qstrm is activated by the
session for transport parameters exchange, prior to the mux layer
initialization.

2 weeks agoMINOR: mux-quic: use QMux transport parameters from qstrm xprt
Amaury Denoyelle [Fri, 27 Mar 2026 13:29:09 +0000 (14:29 +0100)] 
MINOR: mux-quic: use QMux transport parameters from qstrm xprt

Defines an API for xprt_qstrm so that the QMux transport parameters can
be retrieved by the MUX layer on its initialization. This concerns both
local and remote parameters.

Functions xprt_qstrm_lparams/rparams() are defined and exported for
this. They are both used in qmux_init() if QMux protocol is active.

2 weeks agoMEDIUM: ssl: load xprt_qstrm after handshake completion
Amaury Denoyelle [Wed, 25 Mar 2026 13:17:38 +0000 (14:17 +0100)] 
MEDIUM: ssl: load xprt_qstrm after handshake completion

On SSL handshake completion, MUX layer can be initialized if not already
the case. However, for QMux protocol, it is necessary first to perform
transport parameters exchange, via the new xprt_qstrm layer. This patch
ensures this is performed if any flag CO_FL_QSTRM_* is set on the
connection.

Also, SSL layer registers itself via add_xprt. This ensures that it can
be used by xprt_qstrm for the emission/reception of the necessary
frames.

2 weeks agoMINOR: xprt_qstrm: implement sending of transport parameters
Amaury Denoyelle [Wed, 25 Mar 2026 13:14:20 +0000 (14:14 +0100)] 
MINOR: xprt_qstrm: implement sending of transport parameters

This patch implements QMux emission of transport parameters via
xprt_qstrm. Similarly to receive, this is performed in conn_send_qstrm()
which uses lower xprt snd_buf operation. The connection must first be
flagged with CO_FL_QSTRM_SEND to trigger this step.

2 weeks agoMINOR: xprt_qstrm: implement reception of transport parameters
Amaury Denoyelle [Wed, 25 Mar 2026 08:05:21 +0000 (09:05 +0100)] 
MINOR: xprt_qstrm: implement reception of transport parameters

Extend xprt_qstrm to implement the reception of QMux transport
parameters. This is performed via conn_recv_qstrm() which relies on the
lower xprt rcv_buf operation. Once received, parameters are kept in
xprt_qstrm context, so that the MUX can retrieve them on init.

For the reception of parameters to be active, the connection must first
be flagged with CO_FL_QSTRM_RECV.

2 weeks agoMINOR: xprt_qstrm: define callback for ALPN retrieval
Amaury Denoyelle [Wed, 25 Mar 2026 08:03:41 +0000 (09:03 +0100)] 
MINOR: xprt_qstrm: define callback for ALPN retrieval

Add get_alpn operation support for xprt_qstrm. This simply acts as a
passthrough method to the underlying XPRT layer.

This function is necessary for QMux when running above SSL, as mux-quic
will access ALPN during its initialization in order to instantiate the
proper application protocol layer.

2 weeks agoMINOR: xprt_qstrm: define new xprt module for QMux protocol
Amaury Denoyelle [Tue, 24 Mar 2026 15:58:48 +0000 (16:58 +0100)] 
MINOR: xprt_qstrm: define new xprt module for QMux protocol

Define a new XPRT layer for the new QMux protocol. Its role will be to
perform the initial exchange of transport parameters.

On completion, contrary to XPRT handshake, xprt_qstrm will first init
the MUX and then removes itself. This will be necessary so that the
parameters can be retrieved by the MUX during its initialization.

This patch only declares the new xprt_qstrm along with basic operations.
Future commits will implement the proper reception/emission steps.

2 weeks agoMINOR: mux-quic: define Tx connection buffer for QMux
Amaury Denoyelle [Thu, 2 Apr 2026 09:58:04 +0000 (11:58 +0200)] 
MINOR: mux-quic: define Tx connection buffer for QMux

Similarly to reception, a new buffer is defined in QCC connection to
handle emission for QMux protocol. This replaces the trash buffer usage
in qcc_qstrm_send_frames().

This buffer is necessary to handle partial emission. On retry, the
buffer must be completely emitted before starting to send new frames.

2 weeks agoMINOR: mux-quic: implement qstream send callback
Amaury Denoyelle [Fri, 27 Mar 2026 09:16:56 +0000 (10:16 +0100)] 
MINOR: mux-quic: implement qstream send callback

Each time a QUIC frame is emitted, mux-quic layer is notified via a
callback to update the underlying QCS. For QUIC, this is performed via
qc_stream_desc element.

In QMux protocol, this can be simplified as there is no
qc_stream_desc/quic_conn layer interaction. Instead, each time snd_buf
is called, QCS can be updated immediately using its return value. This
is performed via a new function qstrm_ctrl_send().

Its work is similar to the QUIC equivalent but in a simpler mode. In
particular, sent data can be immediately removed from the Tx buffer as
there is no need for retransmission when running above TCP.

2 weeks agoMEDIUM: mux-quic: implement QMux send
Amaury Denoyelle [Fri, 27 Mar 2026 13:41:40 +0000 (14:41 +0100)] 
MEDIUM: mux-quic: implement QMux send

This patchs implement mux-quic reception for the new QMux protocol. This
is performed via the new function qcc_qstrm_send_frames(). Its interface
is similar to the QUIC equivalent : it takes a list of frames and
encodes them in a buffer before sending it via snd_buf.

Contrary to QUIC, a check on CO_FL_ERROR flag is performed prior to
every qcc_qstrm_send_frames() invokation to interrupt emission. This is
necessary as the transport layer may set it during snd_buf. This is not
the case currently for quic_conn layer, but maybe a similar mechanism
should be implemented as well for QUIC in the future.

2 weeks agoMINOR: mux_quic: implement qstrm rx buffer realign
Amaury Denoyelle [Mon, 30 Mar 2026 09:18:54 +0000 (11:18 +0200)] 
MINOR: mux_quic: implement qstrm rx buffer realign

The previous patch defines a new QCC buffer member to implement QMux
reception. This patch completes this by perfoming realign on it during
qcc_qstrm_recv(). This is necessary when there is not enough contiguous
data to read a whole frame.

2 weeks agoMINOR: mux-quic: define Rx connection buffer for QMux
Amaury Denoyelle [Fri, 27 Mar 2026 09:14:39 +0000 (10:14 +0100)] 
MINOR: mux-quic: define Rx connection buffer for QMux

When QMux is used, mux-quic must actively performed reception of new
content. This has been implemented by the previous patch.

The current patch extends this by defining a buffer on QCC dedicated to
this operation. This replaces the usage of the trash buffer. This is
necessary to deal with incomplete reads.

2 weeks agoMINOR: mux-quic: handle flow-control frame on qstream read
Amaury Denoyelle [Fri, 27 Mar 2026 09:15:13 +0000 (10:15 +0100)] 
MINOR: mux-quic: handle flow-control frame on qstream read

Implements parsing of frames related to flow-control for mux-quic
running on the new QMux protocol. This simply calls qcc_recv_*() MUX
functions already used by QUIC.

2 weeks agoMEDIUM: mux-quic: implement QMux receive
Amaury Denoyelle [Fri, 27 Mar 2026 13:39:34 +0000 (14:39 +0100)] 
MEDIUM: mux-quic: implement QMux receive

This patch implements a new function qcc_qstrm_recv() dedicated to the
new QMux protocol. It is responsible to perform data reception via
rcv_buf() callback. This is defined in a new mux_quic_strm module.

Read data are parsed in frames. Each frame is handled via standard
mux-quic functions. Currently, only STREAM and RESET_STREAM types are
implemented.

One major difference between QUIC and QMux is that mux-quic is passive
on the reception side on the former protocol. For the new one, mux-quic
becomes active. Thus, a new call to qcc_qstrm_recv() is performed via
qcc_io_recv().

2 weeks agoMINOR: quic: abstract stream type in qf_stream frame
Amaury Denoyelle [Wed, 10 Dec 2025 09:43:36 +0000 (10:43 +0100)] 
MINOR: quic: abstract stream type in qf_stream frame

STREAM frame will also be used by the new QMux protocol. This requires
some adaptation in the qf_stream structure. Reference to qc_stream_desc
object is replaced by a generic void* pointer.

This change is necessary as QMux protocol will not use any
qc_stream_desc elements for emission.

2 weeks agoMINOR: mux-quic: prepare traces support for QMux
Amaury Denoyelle [Thu, 26 Mar 2026 14:03:04 +0000 (15:03 +0100)] 
MINOR: mux-quic: prepare traces support for QMux

Ensure mux-quic traces will be compatible with the new QMux protocol.
This is necessary as the quic_conn element is accessed to display some
transport information. Use conn_is_quic() to protect these accesses.

2 weeks agoMINOR: mux-quic: protect qcc_io_process for QMux
Amaury Denoyelle [Thu, 2 Apr 2026 10:00:18 +0000 (12:00 +0200)] 
MINOR: mux-quic: protect qcc_io_process for QMux

Use conn_is_quic() prior to quic_conn manipulation in qcc_io_process().
This will be necessary to ensure compatibility with the new QMux
protocol.

2 weeks agoMINOR: mux-quic: convert init/closure for QMux compatibility
Amaury Denoyelle [Thu, 2 Apr 2026 10:00:36 +0000 (12:00 +0200)] 
MINOR: mux-quic: convert init/closure for QMux compatibility

Ensure mux-quic operations related to initialization and shutdown will
be compatible with the new QMux protocol. This requires to use
conn_is_quic() before any access to the quic_conn element, in
qmux_init(), qcc_shutdown() and qcc_release().

2 weeks agoMINOR: mux-quic: prepare Tx support for QMux
Amaury Denoyelle [Thu, 26 Mar 2026 13:57:49 +0000 (14:57 +0100)] 
MINOR: mux-quic: prepare Tx support for QMux

Adapts mux-quic functions related to emission for future QMux protocol
support.

In short, QCS will not used a qc_stream_desc object but instead a plain
buffer. This is inserted as a union in QCS structure. Every access to
QUIC qc_stream_desc is protected by a prior conn_is_quic() check. Also,
pacing is useless for QMux and thus is disabled for such protocol.

2 weeks agoMINOR: mux-quic: move qcs stream member into tx inner struct
Amaury Denoyelle [Tue, 31 Mar 2026 15:55:10 +0000 (17:55 +0200)] 
MINOR: mux-quic: move qcs stream member into tx inner struct

Move <stream> field from qcs type into the inner structure 'tx'. This
change is only a minor refactoring without any impact. It is cleaner as
Rx buffer elements are already present in 'rx' inner structure.

This reorganization is performed before introducing of a new Tx buffer
field used for QMux protocol.

2 weeks agoMINOR: quic: implement QMux transport params frame parser/builder
Amaury Denoyelle [Mon, 30 Mar 2026 14:39:57 +0000 (16:39 +0200)] 
MINOR: quic: implement QMux transport params frame parser/builder

Implement parse/build methods for QX_TRANSPORT_PARAMETER frame. Both
functions may fail due to buffer space too small (encoding) or truncated
frame (parsing).

2 weeks agoMINOR: quic: define QMux transport parameters frame type
Amaury Denoyelle [Wed, 12 Feb 2025 16:54:13 +0000 (17:54 +0100)] 
MINOR: quic: define QMux transport parameters frame type

Define a new frame type for QMux transport parameter exchange. Frame
type is 0x3f5153300d0a0d0a and is declared as an extra frame, outside of
quic_frame_parsers / quic_frame_builders.

The next patch will implement parsing/encoding of this frame payload.

2 weeks agoMINOR: quic: remove useless quic_tp_dec_err type
Amaury Denoyelle [Wed, 1 Apr 2026 11:56:33 +0000 (13:56 +0200)] 
MINOR: quic: remove useless quic_tp_dec_err type

The previous patch refactored QUIC transport parameters decoding and
validity checks. These two operation are now performed in two distinct
functions. This renders quic_tp_dec_err type useless. Thus, this patch
removes it. Function returns are converted to a simple integer value.

2 weeks agoMINOR: quic: split transport params decoding/check
Amaury Denoyelle [Wed, 1 Apr 2026 11:20:42 +0000 (13:20 +0200)] 
MINOR: quic: split transport params decoding/check

Function quic_transport_params_decode() is used for decoding received
parameters. Prior to this patch, it also contained validity checks on
some of the parameters. Finally, it also tested that mandatory
parameters were indeed found.

This patch separates this two parts. Params validity is now tested in a
new function quic_transport_params_check(), which can be called just
after decode operation.

This patch will be useful for QMux protocol, as this allows to reuse
decode operation without executing checks which are tied to the QUIC
specification, in particular for mandatory parameters.

2 weeks agoBUG/MINOR: quic: fix documentation for transport params decoding
Amaury Denoyelle [Wed, 1 Apr 2026 11:10:21 +0000 (13:10 +0200)] 
BUG/MINOR: quic: fix documentation for transport params decoding

The documentation for functions related to transport parameters decoding
is unclear or sometimes completely wrong on the meaning of the <server>
argument. It must be set to reflect the origin of the parameters,
contrary to what was implied in function comments.

Fix this by rewriting comments related to this <server> argument. This
should prevent to make any mistake in the future.

This is purely a documentation fix. However, it could be useful to
backport it up to 2.6.

2 weeks agoMINOR: quic: refactor frame encoding
Amaury Denoyelle [Mon, 30 Mar 2026 12:11:17 +0000 (14:11 +0200)] 
MINOR: quic: refactor frame encoding

This patch is a direct follow-up of the previous one. This time,
refactoring is performed on qc_build_frm() which is used for frame
encoding.

Function prototype has changed as now packet argument is removed. To be
able to check frame validity with a packet, one can use the new parent
function qc_build_frm_pkt() which relies on qc_build_frm().

As with the previous patch, there is no function change expected. The
objective is to facilitate a future QMux implementation.

2 weeks agoMINOR: quic: refactor frame parsing
Amaury Denoyelle [Wed, 19 Feb 2025 13:53:14 +0000 (14:53 +0100)] 
MINOR: quic: refactor frame parsing

This patch refactors parsing in QUIC frame module. Function
qc_parse_frm() has been splitted in three :
* qc_parse_frm_type()
* qc_parse_frm_pkt()
* qc_parse_frm_payload()

No functional change. The main objective of this patch is to facilitate
a QMux implementation. One of the gain is the ability to manipulate QUIC
frames without any reference to a QUIC packet as it is irrelevant for
QMux. Also, quic_set_connection_close() calls are extracted as this
relies on qc type. The caller is now responsible to set the required
error code.

2 weeks agoMINOR: connection: add function to identify a QUIC connection
Amaury Denoyelle [Thu, 26 Mar 2026 13:57:19 +0000 (14:57 +0100)] 
MINOR: connection: add function to identify a QUIC connection

Add a simple helper conn_is_quic() function which tells if a connection
runs over QUIC protocol. It will be useful when implementing QMux
alternative.

2 weeks agoMINOR: acme: set the default dns-delay to 30s
William Lallemand [Thu, 2 Apr 2026 11:29:43 +0000 (13:29 +0200)] 
MINOR: acme: set the default dns-delay to 30s

Set the default dns-delay to 30s so it can be more efficient with fast
DNS providers. The dns-timeout is set to 600s by default so this does
not have a big impact, it will only do more check and allow the
challenge to be started more quickly.

2 weeks agoCLEANUP: net_helper: fix typo in comment
Ilia Shipitsin [Tue, 31 Mar 2026 22:49:18 +0000 (00:49 +0200)] 
CLEANUP: net_helper: fix typo in comment

"the the" --> "then the"

2 weeks agoMINOR: acme: add 'dns-timeout' keyword for dns-01 challenge
William Lallemand [Wed, 1 Apr 2026 16:30:06 +0000 (18:30 +0200)] 
MINOR: acme: add 'dns-timeout' keyword for dns-01 challenge

When using the dns-01 challenge method with "challenge-ready dns", HAProxy
retries DNS resolution indefinitely at the interval set by "dns-delay". This
adds a "dns-timeout" keyword to set a maximum duration for the DNS check phase
(default: 600s). If the next resolution attempt would be scheduled beyond that
deadline, the renewal is aborted with an explicit error message.

A new "dnsstarttime" field is stored in the acme_ctx to record when DNS
resolution began, used to evaluate the timeout on each retry.

2 weeks agoREGTESTS: tcpcheck: Add a script to check healthcheck section
Christopher Faulet [Tue, 31 Mar 2026 06:48:19 +0000 (08:48 +0200)] 
REGTESTS: tcpcheck: Add a script to check healthcheck section

The script healthcheck-section.vtc is added to verify the healthcheck
sections are properly parsed and used by servers.

2 weeks agoMEDIUM: tcpcheck/server: Add healthcheck server keyword
Christopher Faulet [Fri, 27 Mar 2026 15:24:16 +0000 (16:24 +0100)] 
MEDIUM: tcpcheck/server: Add healthcheck server keyword

Thanks to this patch, it is now possible to specify an healthcheck section
on the server line. In that case, the server will use the tcpcheck as
defined in the correspoding healthcheck section instead of the proxy's one.

2 weeks agoMINOR: tcpcheck: Extract tcpheck ruleset post-config in a dedicated function
Christopher Faulet [Mon, 30 Mar 2026 05:50:17 +0000 (07:50 +0200)] 
MINOR: tcpcheck: Extract tcpheck ruleset post-config in a dedicated function

This will be mandatory to attache a healthcheck section to a server.
check_tcpcheck_ruleset() function is introduced for this purpose.

2 weeks agoMEDIUM: tcpcheck: Add parsing support for healthcheck sections
Christopher Faulet [Fri, 27 Mar 2026 06:35:00 +0000 (07:35 +0100)] 
MEDIUM: tcpcheck:  Add parsing support for healthcheck sections

tcpcheck_ruleset struct was extended to host a config part that will be used
for healthcheck sections. This config part is mainly used to store element
for the server's tcpcheck part.

When a healthcheck section is parsed, a ruleset is created with its name
(which must be unique). "*healthcheck-{NAME}" is used for these ruleset. So
it is not possible to mix them with regular rulesets.

For now, in a healthcheck section, the type must be defined, based on the
options name (tcp-check, httpchk, redis-check...). In addition, several
"tcp-check" or "http-check" rules can be specified, depending on the
healthcheck type.

2 weeks agoMEDIUM: tcpcheck: Split parsing functions to prepare healthcheck sections parsing
Christopher Faulet [Thu, 26 Mar 2026 22:06:14 +0000 (23:06 +0100)] 
MEDIUM: tcpcheck: Split parsing functions to prepare healthcheck sections parsing

Functions used to parse directives related to tcpchecks were split to have a
first step testing the proxy and creating the tcpcheck ruleset if necessary,
and a second step filling the ruleset. The aim of this patch is to preapre
the parsing of healthcheck sections. In this context, only the second steip
will be used.

2 weeks agoMINOR: tcpcheck: Add a function to stringify the healthcheck type
Christopher Faulet [Fri, 27 Mar 2026 14:37:04 +0000 (15:37 +0100)] 
MINOR: tcpcheck: Add a function to stringify the healthcheck type

tcpcheck_ruleset_type_to_str() function is created to return a string
corresponding to a tcpcheck type.

2 weeks agoCLEANUP: tcpcheck: Don't needlessly expose proxy_parse_tcpcheck()
Christopher Faulet [Thu, 26 Mar 2026 22:01:04 +0000 (23:01 +0100)] 
CLEANUP: tcpcheck: Don't needlessly expose proxy_parse_tcpcheck()

proxy_parse_tcpcheck() function is not used outside of tcpcheck.c file. So
stop to export it.

2 weeks agoBUG/MINOR: tcpcheck: Use tcpcheck context for expressions parsing
Christopher Faulet [Thu, 26 Mar 2026 21:57:58 +0000 (22:57 +0100)] 
BUG/MINOR: tcpcheck: Use tcpcheck context for expressions parsing

When log-format stirngs were parsed in context of a tcpcheck, ARGC_SRV
context was used instead of ARGC_TCK. This context is used to report
accurrate errors.

This patch could be backported to all stable versions.

2 weeks agoMINOR: tcpcheck: Use tcpcheck flags to know a healthcheck uses SSL connections
Christopher Faulet [Thu, 26 Mar 2026 21:54:12 +0000 (22:54 +0100)] 
MINOR: tcpcheck: Use tcpcheck flags to know a healthcheck uses SSL connections

The proxy flag PR_O_TCPCHK_SSL is replaced by a flag on the tcpcheck
itself. When TCPCHK_FL_USE_SSL flag is set, it means the healthcheck will
use an SSL connection and the SSL xprt must be prepared for the server.

2 weeks agoBUG/MINOR: tcpcheck: Don't enable http_needed when parsing HTTP samples
Christopher Faulet [Thu, 26 Mar 2026 12:42:28 +0000 (13:42 +0100)] 
BUG/MINOR: tcpcheck: Don't enable http_needed when parsing HTTP samples

In tcpchecks context, when HTTP sample expressions are parsed, there is no
reason to set the proxy's http_needed value to 1. This value is only used
for streams to allocate an HTTP txn.

This patch could be backported to all stable versions.

2 weeks agoMINOR: tcpcheck: Deal with disable-on-404 and send-state in the tcp-check itself
Christopher Faulet [Thu, 26 Mar 2026 08:14:58 +0000 (09:14 +0100)] 
MINOR: tcpcheck: Deal with disable-on-404 and send-state in the tcp-check itself

disable-on-404 and send-state options, configured on an HTTP healtcheck,
were handled as proxy options. Now, these options are handled in the
tcp-check itself. So the corresponding PR_O and PR_02 flags are removed.

2 weeks agoMEDIUM: tcpcheck: Refactor how tcp-check rulesets are stored
Christopher Faulet [Thu, 26 Mar 2026 07:56:29 +0000 (08:56 +0100)] 
MEDIUM: tcpcheck: Refactor how tcp-check rulesets are stored

The tcpcheck_rules structure is replaced by the tcpcheck structure. The main
difference is that the ruleset is now referenced in the tcpcheck structure,
instead of the rules list. The flags about the ruleset type are moved into
the ruleset structure and flags to track unused rules remains on the
tcpcheck structure. So it should be easier to track unused rulesets. But it
should be possible to configure a set of tcpcheck rules outside of the proxy
scope.

The main idea of these changes is to prepare the parsing of a new
healthcheck section. So this patch is quite huge, but it is mainly about
renaming some fields.

2 weeks agoBUG/MINOR: tcpcheck: Remove unexpected flag on tcpcheck rules for httchck option
Christopher Faulet [Tue, 24 Mar 2026 13:55:01 +0000 (14:55 +0100)] 
BUG/MINOR: tcpcheck: Remove unexpected flag on tcpcheck rules for httchck option

When parsing httpchck option, a wrong flag (TCPCHK_SND_HTTP_FROM_OPT) was
set on the rules, while it is in fact a flag for a send rule. Let's remove
it. There is no issue here because there is no corresponding flag for
tcpcheck rules.

This patch must be backported to all stable versions.

2 weeks agoMEDIUM: http_act: Rework *-headers-bin actions
Christopher Faulet [Wed, 1 Apr 2026 12:02:30 +0000 (14:02 +0200)] 
MEDIUM: http_act: Rework *-headers-bin actions

These actions were added recently and it appeared the way binary headers
were retrieved could be simplified.

First, there is no reason to retrieve a base64 encoded string. It is
possible to rely on the binary string directly. "b64dec" converter can be
used to perform a base64 decoding if necessary.

Then, using a log-format string is quite overkill and probably
conterintuitive. Most of time, the headers will be retrieved from a
variable. So a sample expression is easier to use. Thanks to the previous
patch, it is quite easy to achieve.

This patch relies on the commit "MINOR: action: Add a sample expression
field in arguments used by HTTP actions". The documentation was updated
accordingly.

2 weeks agoMINOR: action: Add a sample expression field in arguments used by HTTP actions
Christopher Faulet [Wed, 1 Apr 2026 12:00:24 +0000 (14:00 +0200)] 
MINOR: action: Add a sample expression field in arguments used by HTTP actions

This could be useful for some HTTP actions. It was possible to rely on a
log-format string. It is now possible to also use a sample expression.

2 weeks agoBUG/MINOR: http_act: Make set/add-headers-bin compatible with ACL conditions
Christopher Faulet [Wed, 1 Apr 2026 09:17:47 +0000 (11:17 +0200)] 
BUG/MINOR: http_act: Make set/add-headers-bin compatible with ACL conditions

An error is erroneously triggered if a if/unless statement is found after
set-headers-bin and add-headers-bin actions. To make it works, during
parsing of these actions, we should leave when an unknown argument is found
to let the rule parser the opportunity to parse an if/unless statement.

No backport needed.

2 weeks agoDOC: configuration: update tune.ssl.keylog URL to IETF draft
William Lallemand [Wed, 1 Apr 2026 14:21:27 +0000 (16:21 +0200)] 
DOC: configuration: update tune.ssl.keylog URL to IETF draft

Replace the Mozilla NSS key log format link with the IETF draft:
https://tlswg.org/sslkeylogfile/draft-ietf-tls-keylogfile.html

2 weeks agoMINOR: ssl/log: add keylog format variables and env vars
William Lallemand [Wed, 1 Apr 2026 08:56:24 +0000 (10:56 +0200)] 
MINOR: ssl/log: add keylog format variables and env vars

Add keylog_format_fc and keylog_format_bc global variables containing
the SSLKEYLOGFILE log-format strings for the frontend (client-facing)
and backend (server-facing) TLS connections respectively. These produce
output compatible with the SSLKEYLOGFILE format described at:
https://tlswg.org/sslkeylogfile/draft-ietf-tls-keylogfile.html

Both formats are also exported as environment variables at startup:
  HAPROXY_KEYLOG_FC_LOG_FMT
  HAPROXY_KEYLOG_BC_LOG_FMT

These variables contains \n so they might not be compatible with syslog
servers, using them with stderr or a sink might be required.

These can be referenced directly in "log-format" directives to produce
SSLKEYLOGFILE-compatible output, usable by network analyzers such as
Wireshark to decrypt captured TLS traffic.

2 weeks agoMINOR: servers: Don't update last_sess if it did not change
Olivier Houchard [Wed, 1 Apr 2026 13:08:26 +0000 (15:08 +0200)] 
MINOR: servers: Don't update last_sess if it did not change

Check that last_sess actually changed before attempting to set it, as it
should only change once every second, that will avoid a lot of atomic
writes on a busy cache line.

2 weeks agoMINOR: backends: Don't update last_sess if it did not change
Olivier Houchard [Wed, 1 Apr 2026 13:01:09 +0000 (15:01 +0200)] 
MINOR: backends: Don't update last_sess if it did not change

Check that last_sess actually changed before attempting to set it, as it
should only change once every second, that will avoid a lot of atomic
writes on a busy cache line.

2 weeks agoMEDIUM: stats: Hide the version by default and add stats-showversion
Olivier Houchard [Wed, 1 Apr 2026 12:25:05 +0000 (14:25 +0200)] 
MEDIUM: stats: Hide the version by default and add stats-showversion

Reverse the default, to hide the version from stats by default, and add
a new keyword, "stats show-version", to enable them, as we don't want to
disclose the version by default, especially on public websites.

2 weeks agoBUG/MINOR: http_act: Properly handle decoding errors in *-headers-bin actions
Christopher Faulet [Tue, 31 Mar 2026 20:24:32 +0000 (22:24 +0200)] 
BUG/MINOR: http_act: Properly handle decoding errors in *-headers-bin actions

When binary headers are decoded, return value of decode_varint() function is
not properly handled. On error, it can return -1. However, the result is
inconditionnaly added to an unsigned offset.

Now, a temporary variable is used to be abl to test decode_varint() return
value. It is added to the offset on success only.

No backport needed.

2 weeks agoBUG/MEDIUM: mux-h1: Don't set MSG_MORE on bodyless responses forwarded to client
Cody Ohlsen [Sat, 28 Mar 2026 00:05:20 +0000 (17:05 -0700)] 
BUG/MEDIUM: mux-h1: Don't set MSG_MORE on bodyless responses forwarded to client

When h1_snd_buf() inherits the CO_SFL_MSG_MORE flag from the upper layer, it
unconditionally propagates it to H1C_F_CO_MSG_MORE, which eventually sets
MSG_MORE on the sendmsg() call. For bodyless responses (HEAD, 204, 304), this
causes the kernel to cork the TCP connection for ~200ms waiting for body data
that will never be sent.

With an H1 frontend and H2 backend, this adds ~200ms of latency to many or
all bodyless responses. The 200ms corresponds to the kernel's tcp_cork_time
default. H1 backends are less affected because h1_postparse_res_hdrs() sets
HTX_FL_EOM during header parsing for bodyless responses, but H2 backends
frequently deliver the end-of-stream signal in a separate scheduling round,
leaving htx_expect_more() returning TRUE when headers are first forwarded.

The fix guards H1C_F_CO_MSG_MORE so it is only set when the connection is a
backend (H1C_F_IS_BACK) or the response is not bodyless
(!H1S_F_BODYLESS_RESP). This ensures bodyless responses on the front
connection are sent immediately without corking.

This should be backported to all stable branches.

Co-developed-by: Billy Campoli <bcampoli@meta.com>
Co-developed-by: Chandan Avdhut <cavdhut@meta.com>
Co-developed-by: Neel Raja <neelraja@meta.com
2 weeks agoMEDIUM: Add set-headers-bin, add-headers-bin and del-headers-bin actions
Nenad Merdanovic [Mon, 30 Mar 2026 21:58:21 +0000 (23:58 +0200)] 
MEDIUM: Add set-headers-bin, add-headers-bin and del-headers-bin actions

These actions allow setting, adding and deleting multiple headers from
the same action, without having to know the header names during parsing.
This is useful when doing things with SPOE.

2 weeks agoDOC: configuration: mention QUIC server support
Amaury Denoyelle [Tue, 31 Mar 2026 15:39:10 +0000 (17:39 +0200)] 
DOC: configuration: mention QUIC server support

Adds 'quic4@' / 'quic6@' as prefixes available for server addresses.
This is explicitely listed as experimental for now.

This must be backported up to 3.3.

2 weeks agoBUG/MEDIUM: map/cli: CLI commands lack admin permission checks
William Lallemand [Wed, 25 Mar 2026 13:57:08 +0000 (14:57 +0100)] 
BUG/MEDIUM: map/cli: CLI commands lack admin permission checks

The CLI commands (get|add|del|clear|commit|set) | (acl|map) does not
contain a permission check on admin level.

Must be backported to 3.3. This can be a breaking change for some users.

Initially reported by Cameron Brown.

2 weeks agoBUG/MEDIUM: ssl/ocsp: ocsp commands are missing permission checks
William Lallemand [Wed, 25 Mar 2026 13:47:10 +0000 (14:47 +0100)] 
BUG/MEDIUM: ssl/ocsp: ocsp commands are missing permission checks

'set ssl ocsp-response', 'update ssl ocsp-response', 'show ssl
ocsp-response', 'show ssl ocsp-updates' are lacking permissions checks
on admin level.

Must be backported in 3.3. This can be a breaking change for some users.

Initially reported by Cameron Brown.

2 weeks agoBUG/MEDIUM: ssl/cli: tls-keys commands are missing permission checks
William Lallemand [Wed, 25 Mar 2026 10:54:09 +0000 (11:54 +0100)] 
BUG/MEDIUM: ssl/cli: tls-keys commands are missing permission checks

Both 'set ssl tls-key' and 'show tls-keys' command are missing the
permission checks so the commands can be used only in admin mode.

Must be backported to 3.3. This can be a breaking change for some users.

Initially reported by Cameron Brown.

2 weeks agoBUG/MEDIUM: map/cli: map/acl commands warn when accessed without admin level
William Lallemand [Tue, 31 Mar 2026 09:36:08 +0000 (11:36 +0200)] 
BUG/MEDIUM: map/cli: map/acl commands warn when accessed without admin level

This commit adds an ha_warning() when map/acl commands are accessed
without admin level. This is to warn users that these commands will be
restricted to admin only in HAProxy 3.3.

Must be backported in every stable branches.

Initially reported by Cameron Brown.

2 weeks agoBUG/MEDIUM: ssl/ocsp: ocsp commands warn when accessed without admin level
William Lallemand [Tue, 31 Mar 2026 09:35:46 +0000 (11:35 +0200)] 
BUG/MEDIUM: ssl/ocsp: ocsp commands warn when accessed without admin level

This commit adds an ha_warning() when OCSP commands are accessed without
admin level. This is to warn users that these commands will be
restricted to admin only in HAProxy 3.3.

Must be backported in every stable branches.

Initially reported by Cameron Brown.

2 weeks agoBUG/MEDIUM: ssl/cli: tls-keys commands warn when accessed without admin level
William Lallemand [Tue, 31 Mar 2026 09:34:43 +0000 (11:34 +0200)] 
BUG/MEDIUM: ssl/cli: tls-keys commands warn when accessed without admin level

This commit adds an ha_warning() when 'show tls-keys' or 'set ssl
tls-key' are accessed without admin level. This is to warn users that
these commands will be restricted to admin only in HAProxy 3.3.

Must be backported in every stable branches.

Initially reported by Cameron Brown.

3 weeks agoSCRIPTS: git-show-backports: list new commits and how to review them with -L
Willy Tarreau [Tue, 31 Mar 2026 07:17:03 +0000 (09:17 +0200)] 
SCRIPTS: git-show-backports: list new commits and how to review them with -L

The new "-L" option is convenient for quick backport sessions, but it
doesn't list the commit subjects nor the review command. Let's just add
these to ease backport sessions. However we don't do it in quiet mode
(-q) because the output is sometimes parsed by automatic backport
scripts.

3 weeks agoDOC: configuration: document challenge-ready and dns-delay options for ACME
William Lallemand [Mon, 30 Mar 2026 15:36:51 +0000 (17:36 +0200)] 
DOC: configuration: document challenge-ready and dns-delay options for ACME

Add documentation for two new directives in the acme section:

- challenge-ready: configures the conditions that must be satisfied
  before notifying the ACME server that a dns-01 challenge is ready.
  Accepted values are cli, dns and none. cli waits for an operator
  to signal readiness via the "acme challenge_ready" CLI command. dns
  performs a DNS pre-check against the "default" resolvers section,
  not the authoritative name servers. When both are combined, HAProxy
  waits for the CLI confirmation before triggering the DNS check.

- dns-delay: configures the delay before the first DNS resolution
  attempt and between retries when challenge-ready includes dns.
  Default is 300 seconds.

3 weeks agoMEDIUM: acme: new 'challenge-ready' option
William Lallemand [Fri, 27 Mar 2026 11:18:47 +0000 (12:18 +0100)] 
MEDIUM: acme: new 'challenge-ready' option

The previous patch implemented the 'dns-check' option. This one replaces
it by a more generic  'challenge-ready' option, which allows the user to
chose the condition to validate the readiness of a challenge. It could
be 'cli', 'dns' or both.

When in dns-01 mode it's by default to 'cli' so the external tool used to
configure the TXT record can validate itself. If the tool does not
validate the TXT record, you can use 'cli,dns' so a DNS check would be
done after the CLI validated with 'challenge_ready'.

For an automated validation of the challenge, it should be set to 'dns',
this would check that the TXT record is right by itself.

3 weeks agoMEDIUM: acme: add dns-01 DNS propagation pre-check
William Lallemand [Tue, 24 Mar 2026 20:53:57 +0000 (21:53 +0100)] 
MEDIUM: acme: add dns-01 DNS propagation pre-check

When using the dns-01 challenge type, TXT record propagation across
DNS servers can take time. If the ACME server verifies the challenge
before the record is visible, the challenge fails and it's not possible
to trigger it again.

This patch introduces an optional DNS pre-check mechanism controlled
by two new configuration directives in the "acme" section:

  - "dns-check on|off": enable DNS propagation verification before
    notifying the ACME server (default: off)
  - "dns-delay <time>": delay before querying DNS (default: 300s)

When enabled, three new states are inserted in the state machine
between AUTH and CHALLENGE:

  - ACME_RSLV_WAIT: waits dns-delay seconds before starting
  - ACME_RSLV_TRIGGER: starts an async TXT resolution for each
    pending authorization using HAProxy's resolver infrastructure
  - ACME_RSLV_READY: compares the resolved TXT record against the
    expected token; retries from ACME_RSLV_WAIT if any record is
    missing or does not match

The "acme_rslv" structure is implemented in acme_resolvers.c, it holds
the resolution for each domain. The "auth" structure which contains each
challenge to resolve contains an "acme_rslv" structure. Once
ACME_RSLV_TRIGGER leaves, the DNS tasks run on the same thread, and the
last DNS task which finishes will wake up acme_process().

Note that the resolution goes through the configured resolvers, not
through the authoritative name servers of the domain. The result may
therefore still be affected by DNS caching at the resolver level.

3 weeks agoMINOR: acme: store the TXT record in auth->token
William Lallemand [Tue, 24 Mar 2026 20:51:23 +0000 (21:51 +0100)] 
MINOR: acme: store the TXT record in auth->token

In case of dns-01 challenge, replace the token by the TXT record which
is more pertinent and could be used later to verify if the record is
correct.

3 weeks agoMINOR: resolvers: basic TXT record implementation
William Lallemand [Tue, 24 Mar 2026 10:43:19 +0000 (11:43 +0100)] 
MINOR: resolvers: basic TXT record implementation

This patch adds support for TXT records. It allows to get the first
string of a TXT-record which is limited to 255 characters.
The rest of the record is ignored.

3 weeks agoBUILD: net_helper: fix unterminated comment that broke the build
Willy Tarreau [Mon, 30 Mar 2026 16:23:12 +0000 (18:23 +0200)] 
BUILD: net_helper: fix unterminated comment that broke the build

Latest commit a336c467a0 ("BUG/MINOR: net_helper: fix length controls
on ip.fp tcp options parsing") was malformed and broke the build. This
should be backported wherever the fix above is backported.

3 weeks agoBUG/MINOR: net_helper: fix length controls on ip.fp tcp options parsing
Emeric Brun [Wed, 25 Mar 2026 16:39:21 +0000 (17:39 +0100)] 
BUG/MINOR: net_helper: fix length controls on ip.fp tcp options parsing

If opt len is truncated by tcplen we may read 1 Byte after the
tcp header.

There is also missing controls parsing MSS and WS we may compute
invalid values on fingerprint reading after the tcp header in
case of truncated options.

This patch should be backported on versions including ip.fp

3 weeks agoMINOR: mux-h2: report glitches on early RST_STREAM
Willy Tarreau [Thu, 19 Mar 2026 17:00:20 +0000 (18:00 +0100)] 
MINOR: mux-h2: report glitches on early RST_STREAM

We leverage the SE_FL_APP_STARTED flag to detect whether the application
layer had a chance to run or not when an RST_STREAM is received. This
allows us to triage RST_STREAM between regular ones and harmful ones,
and to count glitches for them. It reveals extremely effective at
detecting fast HEADERS+RST pairs.

It could be useful to backport it to 3.2, though it depends on these
two previous patches to be backported first (the first one was already
planned and the second one is harmless, though will require to drop
the haterm changes):

  BUG/MINOR: stconn: Always declare the SC created from healthchecks as a back SC
  MINOR: stconn: flag the stream endpoint descriptor when the app has started

3 weeks agoMINOR: stconn: flag the stream endpoint descriptor when the app has started
Willy Tarreau [Mon, 30 Mar 2026 14:19:51 +0000 (16:19 +0200)] 
MINOR: stconn: flag the stream endpoint descriptor when the app has started

In order to improve our ability to distinguish operations that had
already started from others under high loads, it would be nice to know
if an application layer (stream) has started to work with an endpoint
or not. The use case typically is a frontend mux instantiating a stream
to instantly cancel it. Currently this info will take some time to be
detected and processed if the applcation's task takes time to wake up.
By flagging the sedesc with SE_FL_APP_STARTED the first time a the app
layer starts, the lower layers can know whether they're cancelling a
stream that has started to work or not, and act accordingly. For now
this is done unconditionally on the backend, and performed early in the
only two app layers that can be reached by a frontend: process_stream()
and process_hstream() (for haterm).

3 weeks agoBUG/MINOR: stconn: Always declare the SC created from healthchecks as a back SC
Christopher Faulet [Mon, 30 Mar 2026 13:24:52 +0000 (15:24 +0200)] 
BUG/MINOR: stconn: Always declare the SC created from healthchecks as a back SC

The SC created from a healthcheck is always a back SC. But SC_FL_ISBACK
flags was missing. Instead of passing it when sc_new_from_check() is called,
the function was simplified to set SC_FL_ISBACK flag systematically when a
SC is created from a healthcheck.

This patch should be backported as far as 2.6.

3 weeks agoCLEANUP: stconn: Remove usless sc_new_from_haterm() declaration
Christopher Faulet [Mon, 30 Mar 2026 13:23:47 +0000 (15:23 +0200)] 
CLEANUP: stconn: Remove usless sc_new_from_haterm() declaration

This function does not exist. Let's remove its declaration.

3 weeks agoBUG/MINOR: quic: close conn on packet reception with incompatible frame
Amaury Denoyelle [Mon, 30 Mar 2026 07:38:13 +0000 (09:38 +0200)] 
BUG/MINOR: quic: close conn on packet reception with incompatible frame

RFC 9000 lists each supported frames and the type of packets in which it
can be present.

Prior to this patch, a packet with an incompatible frame is dropped.
However, QUIC specification mandates that the connection is immediately
closed with PROTOCOL_VIOLATION error code. This patch completes
qc_parse_frm() to add such connection closure.

This must be backported up to 2.6.

3 weeks agoCLEANUP: fix typos and spelling in comments and documentation
Ilia Shipitsin [Sun, 29 Mar 2026 17:22:19 +0000 (19:22 +0200)] 
CLEANUP: fix typos and spelling in comments and documentation

Corrected multiple spelling mistakes across CLI scripts, documentation,
and source comments (e.g. "Specifiy" → "Specify", "explicitely" → "explicitly",
"transfert" → "transfer", "resetted" → "reset", etc.). These changes
improve readability and consistency without altering functionality.

3 weeks agoCI: github: fix tag listing by implementing proper API pagination
Ilia Shipitsin [Sun, 29 Mar 2026 16:30:02 +0000 (18:30 +0200)] 
CI: github: fix tag listing by implementing proper API pagination

The GitHub API silently caps per_page at 100, so passing per_page=200
was silently returning at most 100 tags. AWS-LC-FIPS tags appear late
in the list, causing version detection to fail.

Replace the single-page fetch in get_all_github_tags() with a loop that
iterates all pages.

Could be backported in previous branches.

3 weeks agoBUG/MEDIUM: htx: Fix htx_xfer() to consume more data than expected
Christopher Faulet [Fri, 27 Mar 2026 16:12:18 +0000 (17:12 +0100)] 
BUG/MEDIUM: htx: Fix htx_xfer() to consume more data than expected

When an htx DATA block is partially transfer, we must take care to remove
exactly the copied size. To do so, we must save the size of the last block
value copied and not rely on the last data block after the copy. Indeed,
data can be merged with an existing DATA block, so the last block size can
be larger than the last part copied.

Because of this issue, it is possible to remove more data than
expected. Worse, this could lead to a crash by performing an integer
overflow on the block size.

No backport needed.

3 weeks agoBUG/MINOR: acme: fix task allocation leaked upon error
William Lallemand [Fri, 27 Mar 2026 15:56:47 +0000 (16:56 +0100)] 
BUG/MINOR: acme: fix task allocation leaked upon error

Fix a leak of the task object in acme_start_task() when one of the
condition in the function failed.

Fix issue #3308.

Must be backported to 3.2 and later.

3 weeks agoMINOR: connections: Enhance tune.idle-pool.shared
Olivier Houchard [Thu, 26 Mar 2026 15:53:47 +0000 (16:53 +0100)] 
MINOR: connections: Enhance tune.idle-pool.shared

There are two settings to control idle connection sharing across
threads.
tune.idle-pool.shared, that enables or disables it, and then
tune.takeover-other-tg-connections, which lets you or not get idle
connections from other thread groups.
Add a new keyword for tune.idle-pool.shared, "full", that lets you get
connections from other thread groups (equivalent to "full" keyword for
tune.takeover-other-tg-connections). The "on" keyword now will be
equivalent to the "restrict" one, which allowed getting connection from
other thread groups only when not doing it would result in a connection
failure (when reverse-http or when strict-macxonn are used).
tune.takeover-other-tg-connections will be deprecated.

3 weeks agoBUG/MEDIUM: acme: skip doing challenge if it is already valid
Mia Kanashi [Sun, 22 Feb 2026 23:04:46 +0000 (01:04 +0200)] 
BUG/MEDIUM: acme: skip doing challenge if it is already valid

If server returns an auth with status valid it seems that client
needs to always skip it, CA can recycle authorizations, without
this change haproxy fails to obtain certificates in that case.
It is also something that is explicitly allowed and stated
in the dns-persist-01 draft RFC.

Note that it would be better to change how haproxy does status polling,
and implements the state machine, but that will take some thought
and time, this patch is a quick fix of the problem.

See:
https://github.com/letsencrypt/boulder/issues/2125
https://github.com/letsencrypt/pebble/issues/133

This must be backported to 3.2 and later.

3 weeks agoBUG/MINOR: http-ana: Only consider client abort for abortonclose
Christopher Faulet [Fri, 27 Mar 2026 10:18:39 +0000 (11:18 +0100)] 
BUG/MINOR: http-ana: Only consider client abort for abortonclose

When abortonclose option is enabled (by default since 3.3), the HTTP rules
can no longer yield if the client aborts. However, stream aborts were also
considered. So it was possible to interrupt yielding rules, especially on
the response processing, while the client was still waiting for the
response.

So now, when abortonclose option is enabled, we now take care to only
consider client aborts to prevent HTTP rules to yield.

Many thanks to @DirkyJerky for his detailed analysis.

This patch should fix the issue #3306. It should be backported as far as
2.8.