]> git.ipfire.org Git - thirdparty/haproxy.git/log
thirdparty/haproxy.git
23 months agoBUG/MINOR: htx/mux-h1: Properly handle bodyless responses when splicing is used
Christopher Faulet [Wed, 2 Aug 2023 07:48:55 +0000 (09:48 +0200)] 
BUG/MINOR: htx/mux-h1: Properly handle bodyless responses when splicing is used

There is a mechanisme in the H1 and H2 multiplexer to skip the payload when
a response is returned to the client when it must not contain any payload
(response to a HEAD request or a 204/304 response). However, this does not
work when the splicing is used. The H2 multiplexer does not support the
splicing, so there is no issue. But with the mux-h1, when data are sent
using the kernel splicing, the mux on the server side is not aware the
client side should skip the payload. And once the data are put in a pipe,
there is no way to stop the sending.

It is a defect of the current design. This will be easier to deal with this
case when the mux-to-mux forwarding will be implemented. But for now, to fix
the issue, we should add an HTX flag on the start-line to pass the info from
the client side to the server side and be able to disable the splicing in
necessary.

The associated reg-test was improved to be sure it does not fail when the
splicing is configured.

This patch should be backported as far as 2.4..

23 months agoMEDIUM: stream: Reset response analyse expiration date if there is no analyzer
Christopher Faulet [Tue, 1 Aug 2023 06:25:01 +0000 (08:25 +0200)] 
MEDIUM: stream: Reset response analyse expiration date if there is no analyzer

When the stream expiration date is computed at the end of process_stream(),
if there is no longer analyzer on the request channel, its analyse
expiration date is reset. The same is now performed on the response
channel. This way, we are sure to not inherit of an orphan expired date.

This should prevent spinning loop on process_stream().

23 months agoBUG/MEDIUM: bwlim: Reset analyse expiration date when then channel analyse ends
Christopher Faulet [Tue, 1 Aug 2023 06:16:42 +0000 (08:16 +0200)] 
BUG/MEDIUM: bwlim: Reset analyse expiration date when then channel analyse ends

The bandwidth limitation filter sets the analyse expiration date on the
channel to restart the data forwarding and thus limit the bandwidth.
However, this expiration date is not reset on abort. So it is possible to
reuse the same expiration date to set the stream one. If it expired before
the end of the stream, this will lead to a spinning loop on process_stream()
because the task expiration date is always set in past.

To fix the issue, when the analyse ends on a channel, the bandwidth
limitation filter reset the corrsponding analyse expiration date.

This patch should fix the issue #2230. It must be backported as far as 2.7.

23 months agoBUILD: cfgparse: keep a single "curproxy"
Willy Tarreau [Tue, 1 Aug 2023 09:18:00 +0000 (11:18 +0200)] 
BUILD: cfgparse: keep a single "curproxy"

Surprisingly, commit 00e00fb42 ("REORG: cfgparse: extract curproxy as a
global variable") caused a build breakage on the CI but not on two
developers' machines. It looks like it's dependent on the linker version
used. What happens is that flt_spoe.c already has a curproxy struct which
already is a copy of the one passed by the parser because it also needed
it to be exported, so they now conflict. Let's just drop this unused copy.

23 months agoMINOR: acl: add acl() sample fetch
Patrick Hemmer [Mon, 24 Jul 2023 18:10:13 +0000 (14:10 -0400)] 
MINOR: acl: add acl() sample fetch

This provides a sample fetch which returns the evaluation result
of the conjunction of named ACLs.

23 months agoREORG: cfgparse: extract curproxy as a global variable
Patrick Hemmer [Thu, 27 Jul 2023 15:09:14 +0000 (11:09 -0400)] 
REORG: cfgparse: extract curproxy as a global variable

This extracts curproxy from cfg_parse_listen so that it can be referenced by
keywords that need the context of the proxy they are being used within.

23 months agoCLEANUP: acl: remove cache_idx from acl struct
Patrick Hemmer [Thu, 27 Jul 2023 15:39:09 +0000 (11:39 -0400)] 
CLEANUP: acl: remove cache_idx from acl struct

It isn't used and never has been.

23 months agoBUG/MINOR: quic+openssl_compat: Non initialized TLS encryption levels
Frédéric Lécaille [Mon, 31 Jul 2023 13:07:06 +0000 (15:07 +0200)] 
BUG/MINOR: quic+openssl_compat: Non initialized TLS encryption levels

The ->openssl_compat struct member of the QUIC connection object was not fully
initialized. This was done on purpose, believing that ->write_level and
->read_level member was initialized by quic_tls_compat_keylog_callback() (the
keylog callback) before entering quic_tls_compat_msg_callback() which
has to parse the TLS messages. In fact this is not the case at all.
quic_tls_compat_msg_callback() is called before quic_tls_compat_keylog_callback()
when receiving the first TLS ClientHello message.

->write_level and ->read_level was not initialized to <ssl_encryption_initial> (= 0)
as this is implicitely done by the originial ngxinx wrapper which calloc()s the openssl
compatibily structure. This could lead to a crash after ssl_to_qel_addr() returns
NULL when called by ha_quic_add_handshake_data().

This patch explicitely initialializes ->write_level and ->read_level to
<ssl_encryption_initial> (=0).

No need to backport.

23 months agoDOC: configuration: rework the custom log format table
William Lallemand [Fri, 28 Jul 2023 08:46:24 +0000 (10:46 +0200)] 
DOC: configuration: rework the custom log format table

Rework the custom log format table to add sample fetch alternatives.

Split the timestamps and the timers from the rest of the tags.

23 months agoBUG/MEDIUM: h3: Be sure to handle fin bit on the last DATA frame
Christopher Faulet [Fri, 28 Jul 2023 07:33:29 +0000 (09:33 +0200)] 
BUG/MEDIUM: h3: Be sure to handle fin bit on the last DATA frame

When DATA frames are decoded for a QUIC stream, we take care to not exceed
the announced content-length, if any. To do so, we check we don't received
more data than excepted but also no less than announced. For the last check,
we rely on the fin bit.

However, it is possible to have several DATA frames to decode at a time
while the end of the stream was received. In this case, we must take care to
handle the fin bit only on the last frame. But because of a bug, the fin bit
was handled to early, erroneously triggering an internal error.

This patch must be backported as far as 2.6.

23 months agoBUG/MINOR: chunk: fix chunk_appendf() to not write a zero if buffer is full
Dragan Dosen [Thu, 27 Jul 2023 18:30:42 +0000 (20:30 +0200)] 
BUG/MINOR: chunk: fix chunk_appendf() to not write a zero if buffer is full

If the buffer is completely full, the function chunk_appendf() would
write a zero past it, which can result in unexpected behavior.

Now we make a check before calling vsnprintf() and return the current
chunk size if no room is available.

This should be backported as far as 2.0.

23 months agoMINOR: quic; Move the QUIC frame pool to its proper location
Frédéric Lécaille [Tue, 25 Jul 2023 15:11:51 +0000 (17:11 +0200)] 
MINOR: quic; Move the QUIC frame pool to its proper location

pool_head_quic_frame QUIC frame pool definition is move from quic_conn-t.h to
quic_frame-t.h.
Its declation is moved from quic_conn.c to quic_frame.c.

23 months agoCLEANUP: quic: quic_conn struct cleanup
Frédéric Lécaille [Tue, 25 Jul 2023 14:49:30 +0000 (16:49 +0200)] 
CLEANUP: quic: quic_conn struct cleanup

Remove no more used QUIC_TX_RING_BUFSZ macro.
Remove several no more used quic_conn struct members.

23 months agoMINOR: quic: Split QUIC connection code into three parts
Frédéric Lécaille [Tue, 25 Jul 2023 13:42:16 +0000 (15:42 +0200)] 
MINOR: quic: Split QUIC connection code into three parts

Move the TX part of the code to quic_tx.c.
Add quic_tx-t.h and quic_tx.h headers for this TX part code.
The definition of quic_tx_packet struct has been move from quic_conn-t.h to
quic_tx-t.h.

Same thing for the TX part:
Move the RX part of the code to quic_rx.c.
Add quic_rx-t.h and quic_rx.h headers for this TX part code.
The definition of quic_rx_packet struct has been move from quic_conn-t.h to
quic_rx-t.h.

23 months agoCLEANUP: quic: Defined but no more used function (quic_get_tls_enc_levels())
Frédéric Lécaille [Tue, 25 Jul 2023 14:04:05 +0000 (16:04 +0200)] 
CLEANUP: quic: Defined but no more used function (quic_get_tls_enc_levels())

This function is no more used since this commit:

    MEDIUM: quic: Handshake I/O handler rework.

Let's remove it!

23 months agoMINOR: quic: Add a new quic_ack.c C module for QUIC acknowledgements
Frédéric Lécaille [Tue, 25 Jul 2023 05:09:24 +0000 (07:09 +0200)] 
MINOR: quic: Add a new quic_ack.c C module for QUIC acknowledgements

Extract the code in relation with the QUIC acknowledgements from quic_conn.c
to quic_ack.c to accelerate the compilation of quic_conn.c.

23 months agoMINOR: quic: Add new "QUIC over SSL" C module.
Frédéric Lécaille [Mon, 24 Jul 2023 14:28:45 +0000 (16:28 +0200)] 
MINOR: quic: Add new "QUIC over SSL" C module.

Move the code which directly calls the functions of the OpenSSL QUIC API into
quic_ssl.c new C file.
Some code have been extracted from qc_conn_finalize() to implement only
the QUIC TLS part (see quic_tls_finalize()) into quic_tls.c.
qc_conn_finalize() has also been exported to be used from this new quic_ssl.c
C module.

23 months agoMINOR: quic: Move TLS related code to quic_tls.c
Frédéric Lécaille [Mon, 24 Jul 2023 12:30:22 +0000 (14:30 +0200)] 
MINOR: quic: Move TLS related code to quic_tls.c

quic_tls_key_update() and quic_tls_rotate_keys() are QUIC TLS functions.
Let's move them to their proper location: quic_tls.c.

23 months agoMINOR: quic: Export QUIC CLI code from quic_conn.c
Frédéric Lécaille [Mon, 24 Jul 2023 09:51:02 +0000 (11:51 +0200)] 
MINOR: quic: Export QUIC CLI code from quic_conn.c

To accelerate the compilation of quic_conn.c file, export the code in relation
with the QUIC CLI from quic_conn.c to quic_cli.c.

23 months agoMINOR: quic: Export QUIC traces code from quic_conn.c
Frédéric Lécaille [Mon, 24 Jul 2023 09:13:44 +0000 (11:13 +0200)] 
MINOR: quic: Export QUIC traces code from quic_conn.c

To accelerate the compilation of quic_conn.c file, export the code in relation
with the traces from quic_conn.c to quic_trace.c.
Also add some headers (quic_trace-t.h and quic_trace.h).

23 months agoBUG/MINOR: quic: Possible crash when acknowledging Initial v2 packets
Frédéric Lécaille [Sat, 22 Jul 2023 09:46:15 +0000 (11:46 +0200)] 
BUG/MINOR: quic: Possible crash when acknowledging Initial v2 packets

The memory allocated for TLS cipher context used to encrypt/decrypt QUIC v2
packets should not be released as soon as possible. Indeed, even if
after having received an client Handshake packet one may drop the Initial
TLS cipher context, one has often to used it to acknowledged Initial packets.

No need to backport.

23 months agoDOC: configuration: add sample fetches for timing events
William Lallemand [Wed, 19 Jul 2023 13:16:42 +0000 (15:16 +0200)] 
DOC: configuration: add sample fetches for timing events

Add the alternatives sample fetches for timing events.

23 months agoMINOR: sample: implement the T* timer tags from the log-format as fetches
William Lallemand [Mon, 3 Jul 2023 09:28:43 +0000 (11:28 +0200)] 
MINOR: sample: implement the T* timer tags from the log-format as fetches

This commit implements the following timer tags available in the log
format as sample fetches:

req.timer.idle (%Ti)
req.timer.tq (%Tq)
req.timer.hdr (%TR)
req.timer.queue (%Tw)

res.timer.hdr (%Tr)
res.timer.user (%Tu)

txn.timer.total (%Ta)
txn.timer.data (%Td)

bc.timer.connect (%Tc)
fc.timer.handshake (%Th)
fc.timer.total (%Tt)

23 months agoDOC: configuration: describe Td in Timing events
William Lallemand [Tue, 25 Jul 2023 07:06:51 +0000 (09:06 +0200)] 
DOC: configuration: describe Td in Timing events

Describe the Td timer in the timing events section.

Must be backported in every stable branches.

23 months agoBUG/MINOR: sample: check alloc_trash_chunk() in conv_time_common()
William Lallemand [Tue, 25 Jul 2023 07:57:02 +0000 (09:57 +0200)] 
BUG/MINOR: sample: check alloc_trash_chunk() in conv_time_common()

Check the trash chunk allocation in conv_time_common(), also remove the
data initialisation which is already done when allocating.

Fixes issue #2227.

No backported needed.

23 months agoMEDIUM: sample: implement us and ms variant of utime and ltime
William Lallemand [Fri, 21 Jul 2023 08:54:41 +0000 (10:54 +0200)] 
MEDIUM: sample: implement us and ms variant of utime and ltime

Implement 4 new fetches:

- ms_ltime
- ms_utime

- us_ltime
- us_utime

Which are the same as ltime and utime but with milliseconds and
microseconds input.

The converters also suports the %N conversion specifier like in date(1).

Unfortunately since %N is not supported by strftime, the format string
is parsed twice, once manually to replace %N, and once by strftime.

23 months agoMINOR: sample: accept_date / request_date return %Ts / %tr timestamp values
William Lallemand [Thu, 13 Jul 2023 14:18:47 +0000 (16:18 +0200)] 
MINOR: sample: accept_date / request_date return %Ts / %tr timestamp values

Implement %[accept_date] which returns the same as %Ts log-format tag.
Implement %[request_date] which is a timestamp for %tr.

accept_date and request_date take an faculative unit argument which can
be 's', 'ms' or 'us'.

The goal is to be able to convert these 2 timestamps to HAProxy date
format like its done with %T, %tr, %trg etc

23 months agoMINOR: sample: implement act_conn sample fetch
William Lallemand [Wed, 12 Jul 2023 16:05:25 +0000 (18:05 +0200)] 
MINOR: sample: implement act_conn sample fetch

Implement the act_conn sample fetch which is the same as %ac (actconn)
in the log-format.

23 months agoMINOR: sample: add pid sample
William Lallemand [Wed, 12 Jul 2023 15:43:26 +0000 (17:43 +0200)] 
MINOR: sample: add pid sample

Implement the pid sample fetch.

23 months agoBUG/MEDIUM: h3: Properly report a C-L header was found to the HTX start-line
Christopher Faulet [Mon, 24 Jul 2023 09:37:10 +0000 (11:37 +0200)] 
BUG/MEDIUM: h3: Properly report a C-L header was found to the HTX start-line

When H3 HEADERS frames are converted to HTX, if a Content-Length header was
found, the HTX start-line must be notified by setting HTX_SL_F_CLEN flag.
Some components may rely on this flag to know there is a content-length
without looping on headers to get the info.

Among other this, it is mandatory for the FCGI multiplexer because it must
announce the message body length.

This patch must be backported as far as 2.6.

23 months agoBUG/MINOR: ssl: OCSP callback only registered for first SSL_CTX
Remi Tricot-Le Breton [Fri, 21 Jul 2023 15:21:15 +0000 (17:21 +0200)] 
BUG/MINOR: ssl: OCSP callback only registered for first SSL_CTX

If multiple SSL_CTXs use the same certificate that has an OCSP response
file on the filesystem, only the first one will have the OCSP callback
set. This bug was introduced by "cc346678d MEDIUM: ssl: Add ocsp_certid
in ckch structure and discard ocsp buffer early" which cleared the
ocsp_response from the ckch_data after it was inserted in the tree,
which prevented subsequent contexts from having the callback registered.

This patch should be backported to 2.8.

23 months ago[RELEASE] Released version 2.9-dev2 v2.9-dev2
Willy Tarreau [Fri, 21 Jul 2023 18:29:42 +0000 (20:29 +0200)] 
[RELEASE] Released version 2.9-dev2

Released version 2.9-dev2 with the following main changes :
    - BUG/MINOR: quic: Possible leak when allocating an encryption level
    - BUG/MINOR: quic: Missing QUIC connection path member initialization
    - BUILD: quic: Compilation fixes for some gcc warnings with -O1
    - DOC: ssl: Fix typo in 'ocsp-update' option
    - DOC: ssl: Add ocsp-update troubleshooting clues and emphasize on crt-list only aspect
    - BUG/MINOR: tcp_sample: bc_{dst,src} return IP not INT
    - MEDIUM: acl/sample: unify sample conv parsing in a single function
    - MINOR: sample: introduce c_pseudo() conv function
    - MEDIUM: sample: add missing ADDR=>? compatibility matrix entries
    - MINOR: sample: fix ipmask sample definition
    - MEDIUM: tree-wide: fetches that may return IPV4+IPV6 now return ADDR
    - MEDIUM: sample: introduce 'same' output type
    - BUG/MINOR: quic: Possible crash in "show quic" dumping packet number spaces
    - BUG/MINOR: cache: A 'max-age=0' cache-control directive can be overriden by a s-maxage
    - BUG/MEDIUM: sink: invalid server list in sink_new_from_logsrv()
    - BUG/MINOR: http_ext: unhandled ERR_ABORT in proxy_http_parse_7239()
    - BUG/MINOR: sink: missing sft free in sink_deinit()
    - BUG/MINOR: ring: size warning incorrectly reported as fatal error
    - BUG/MINOR: ring: maxlen warning reported as alert
    - BUG/MINOR: log: LF upsets maxlen for UDP targets
    - MINOR: sink/api: pass explicit maxlen parameter to sink_write()
    - BUG/MEDIUM: log: improper use of logsrv->maxlen for buffer targets
    - BUG/MINOR: log: fix missing name error message in cfg_parse_log_forward()
    - BUG/MINOR: log: fix multiple error paths in cfg_parse_log_forward()
    - BUG/MINOR: log: free errmsg on error in cfg_parse_log_forward()
    - BUG/MINOR: sink: invalid sft free in sink_deinit()
    - BUG/MINOR: sink: fix errors handling in cfg_post_parse_ring()
    - BUG/MINOR: server: set rid default value in new_server()
    - MINOR: hlua_fcn/mailers: handle timeout mail from mailers section
    - BUG/MINOR: sink/log: properly deinit srv in sink_new_from_logsrv()
    - EXAMPLES: maintain haproxy 2.8 retrocompatibility for lua mailers script
    - BUG/MINOR: hlua_fcn/queue: use atomic load to fetch queue size
    - BUG/MINOR: config: Remove final '\n' in error messages
    - BUG/MINOR: config: Lenient port configuration parsing
    - BUG/MEDIUM: quic: token IV was not computed using a strong secret
    - BUG/MINOR: quic: retry token remove one useless intermediate expand
    - BUG/MEDIUM: quic: missing check of dcid for init pkt including a token
    - BUG/MEDIUM: quic: timestamp shared in token was using internal time clock
    - CLEANUP: quic: remove useless parameter 'key' from quic_packet_encrypt
    - BUG/MINOR: hlua: hlua_yieldk ctx argument should support pointers
    - BUG/MEDIUM: hlua_fcn/queue: bad pop_wait sequencing
    - DOC: config: Fix fc_src description to state the source address is returned
    - BUG/MINOR: sample: Fix wrong overflow detection in add/sub conveters
    - BUG/MINOR: http: Return the right reason for 302
    - MEDIUM: ssl: new sample fetch method to get curve name
    - CI: add naming convention documentation
    - CI: explicitely highlight VTest result section if there's something
    - BUG/MINOR: quic: Unckecked encryption levels availability
    - BUILD: quic: fix warning during compilation using gcc-6.5
    - BUG/MINOR: hlua: add check for lua_newstate
    - BUG/MINOR: h1-htx: Return the right reason for 302 FCGI responses
    - MINOR: lua: Allow reading "proc." scoped vars from LUA core.
    - MINOR: cpuset: add cpu_map_configured() to know if a cpu-map was found
    - BUG/MINOR: config: do not detect NUMA topology when cpu-map is configured
    - BUG/MINOR: cpuset: remove the bogus "proc" from the cpu_map struct
    - BUG/MINOR: init: set process' affinity even in foreground
    - CLEANUP: cpuset: remove the unused proc_t1 field in cpu_map
    - CLEANUP: config: make parse_cpu_set() return documented values
    - BUG/MINOR: server: Don't warn on server resolution failure with init-addr none
    - MINOR: peers: add peers keyword registration
    - MINOR: quic: Stop storing the TX encoded transport parameters
    - MINOR: quic: Dynamic allocation for negotiated Initial TLS cipher context.
    - MINOR: quic: Release asap the negotiated Initial TLS context.
    - MINOR: quic: Add traces to qc_may_build_pkt()
    - MEDIUM: quic: Packet building rework.
    - CLEANUP: quic: Remove a useless TLS related variable from quic_conn_io_cb().
    - MEDIUM: quic: Handshake I/O handler rework.
    - MINOR: quic: Add traces for qc_frm_free()
    - MINOR: quic: add trace about pktns packet/frames releasing
    - BUG/MINOR: quic: Missing parentheses around PTO probe variable.
    - MINOR: quic: Ping from Initial pktns before reaching anti-amplification limit
    - BUG/MINOR: server-state: Ignore empty files
    - BUG/MINOR: server-state: Avoid warning on 'file not found'
    - BUG/MEDIUM: listener: Acquire proxy's lock in relax_listener() if necessary
    - MINOR: quic: QUIC openssl wrapper implementation
    - MINOR: quic: Include QUIC opensssl wrapper header from TLS stacks compatibility header
    - MINOR: quic: Do not enable O-RTT with USE_QUIC_OPENSSL_COMPAT
    - MINOR: quic: Set the QUIC connection as extra data before calling SSL_set_quic_method()
    - MINOR: quic: Do not enable 0RTT with SSL_set_quic_early_data_enabled()
    - MINOR: quic: Add a compilation option for the QUIC OpenSSL wrapper
    - MINOR: quic: Export some KDF functions (QUIC-TLS)
    - MINOR: quic: Make ->set_encryption_secrets() be callable two times
    - MINOR: quic: Initialize TLS contexts for QUIC openssl wrapper
    - MINOR: quic: Call the keylog callback for QUIC openssl wrapper from SSL_CTX_keylog()
    - MINOR: quic: Add a quic_openssl_compat struct to quic_conn struct
    - MINOR: quic: Useless call to SSL_CTX_set_quic_method()
    - MINOR: quic: SSL context initialization with QUIC OpenSSL wrapper.
    - MINOR: quic: Missing encoded transport parameters for QUIC OpenSSL wrapper
    - MINOR: quic: Add "limited-quic" new tuning setting
    - DOC: quic: Add "limited-quic" new tuning setting
    - DOC: install: Document how to build a limited support for QUIC

23 months agoDOC: install: Document how to build a limited support for QUIC
Frédéric Lécaille [Fri, 21 Jul 2023 17:02:30 +0000 (19:02 +0200)] 
DOC: install: Document how to build a limited support for QUIC

Document how to compile a limited support for QUIC (without QUIC O-RTT)
when building haproxy against OpenSSL (without QUIC support).

23 months agoDOC: quic: Add "limited-quic" new tuning setting
Frédéric Lécaille [Fri, 21 Jul 2023 16:32:32 +0000 (18:32 +0200)] 
DOC: quic: Add "limited-quic" new tuning setting

Document "limited-quic" new tuning setting which must be used to
enable the QUIC listener bindings when haproxy is compiled against
a TLS/SSL stack without QUIC support.

23 months agoMINOR: quic: Add "limited-quic" new tuning setting
Frédéric Lécaille [Fri, 21 Jul 2023 16:22:38 +0000 (18:22 +0200)] 
MINOR: quic: Add "limited-quic" new tuning setting

This setting which may be used into a "global" section, enables the QUIC listener
bindings when haproxy is compiled with the OpenSSL wrapper. It has no effect
when haproxy is compiled against a TLS stack with QUIC support, typically quictls.

23 months agoMINOR: quic: Missing encoded transport parameters for QUIC OpenSSL wrapper
Frédéric Lécaille [Fri, 21 Jul 2023 15:27:40 +0000 (17:27 +0200)] 
MINOR: quic: Missing encoded transport parameters for QUIC OpenSSL wrapper

This wrapper needs to have an access to an encoded version of the local transport
parameter (to be sent to the peer). They are provided to the TLS stack thanks to
qc_ssl_compat_add_tps_cb() callback.

These encoded transport parameters were attached to the QUIC connection but
removed by this commit to save memory:

      MINOR: quic: Stop storing the TX encoded transport parameters

This patch restores these transport parameters and attaches them again
to the QUIC connection (quic_conn struct), but only when the QUIC OpenSSL wrapper
is compiled.
Implement qc_set_quic_transport_params() to encode the transport parameters
for a connection and to set them into the stack and make this function work
for both the OpenSSL wrapper or any other TLS stack with QUIC support. Its uses
the encoded version of the transport parameters attached to the connection
when compiled for the OpenSSL wrapper, or local parameters when compiled
with TLS stack with QUIC support. These parameters are passed to
quic_transport_params_encode() and SSL_set_quic_transport_params() as before
this patch.

23 months agoMINOR: quic: SSL context initialization with QUIC OpenSSL wrapper.
Frédéric Lécaille [Thu, 8 Jun 2023 07:28:31 +0000 (09:28 +0200)] 
MINOR: quic: SSL context initialization with QUIC OpenSSL wrapper.

When the QUIC OpenSSL wrapper is used, the keylog has to be set and a QUIC
specific TLS 1.3 extension must be added to the EncryptedExtensions message.
This is done by quic_tls_compat_init().

23 months agoMINOR: quic: Useless call to SSL_CTX_set_quic_method()
Frédéric Lécaille [Thu, 8 Jun 2023 07:22:26 +0000 (09:22 +0200)] 
MINOR: quic: Useless call to SSL_CTX_set_quic_method()

SSL_set_quic_method() is already called at SSL session level. This call
is useless. Furthermore, SSL_CTX_set_quic_method() is not implemented by
the QUIC OpenSSL wrapper to come.

Should be backported as far as 2.6 to ease further backports to come.

23 months agoMINOR: quic: Add a quic_openssl_compat struct to quic_conn struct
Frédéric Lécaille [Thu, 8 Jun 2023 05:14:02 +0000 (07:14 +0200)] 
MINOR: quic: Add a quic_openssl_compat struct to quic_conn struct

Add quic_openssl_compat struct to the quic_conn struct to support the
QUIC OpenSSL wrapper feature.

23 months agoMINOR: quic: Call the keylog callback for QUIC openssl wrapper from SSL_CTX_keylog()
Frédéric Lécaille [Wed, 7 Jun 2023 09:25:35 +0000 (11:25 +0200)] 
MINOR: quic: Call the keylog callback for QUIC openssl wrapper from SSL_CTX_keylog()

SSL_CTX_keylog() is the callback used when the TLS keylog feature is enabled with
tune.ssl.keylog configuration setting. But the QUIC openssl wrapper also needs
to use such a callback to receive the QUIC TLS secrets from the TLS stack.

Add a call to the keylog callback for the QUIC openssl wrapper to SSL_CTX_keylog()
to ensure that it will be called when the TLS keylog feature is enabled.

23 months agoMINOR: quic: Initialize TLS contexts for QUIC openssl wrapper
Frédéric Lécaille [Wed, 7 Jun 2023 09:19:51 +0000 (11:19 +0200)] 
MINOR: quic: Initialize TLS contexts for QUIC openssl wrapper

When the QUIC OpenSSL wrapper use is enabled, all the TLS contexts (SSL_CTX) must
be configured to support it. This is done calling quic_tls_compat_init() from
ssl_sock_prepare_ctx(). Note that quic_tls_compat_init() ignore the TLS context
which are not linked to non-QUIC TLS sessions/connections.

Required for the QUIC openssl wrapper support.

23 months agoMINOR: quic: Make ->set_encryption_secrets() be callable two times
Frédéric Lécaille [Tue, 6 Jun 2023 15:40:41 +0000 (17:40 +0200)] 
MINOR: quic: Make ->set_encryption_secrets() be callable two times

With this patch, ha_set_encryption_secrets() may be callable two times,
one time to derive the RX secrets and a second time to derive the TX secrets.

There was a missing step to do so when the RX secret was received from the stack.
In this case the secret was not stored for the keyupdate, leading the keyupdate
RX part to be uninitialized.

Add a label to initialize the keyupdate RX part and a "goto" statement to run
the concerned code after having derived the RX secrets.

This patch is required to make the keupdate feature work with the OpenSSL wrapper.

Must be backported as far as 2.6.

23 months agoMINOR: quic: Export some KDF functions (QUIC-TLS)
Frédéric Lécaille [Mon, 5 Jun 2023 09:41:58 +0000 (11:41 +0200)] 
MINOR: quic: Export some KDF functions (QUIC-TLS)

quic_hkdf_expand() and quic_hkdf_expand_label() must be used by the QUIC OpenSSL
wrapper.

23 months agoMINOR: quic: Add a compilation option for the QUIC OpenSSL wrapper
Frédéric Lécaille [Fri, 2 Jun 2023 15:07:24 +0000 (17:07 +0200)] 
MINOR: quic: Add a compilation option for the QUIC OpenSSL wrapper

Add USE_QUIC_OPENSSL_COMPAT new compilation option to support the
QUIC OpenSSL wrapper build.

23 months agoMINOR: quic: Do not enable 0RTT with SSL_set_quic_early_data_enabled()
Frédéric Lécaille [Fri, 2 Jun 2023 15:05:38 +0000 (17:05 +0200)] 
MINOR: quic: Do not enable 0RTT with SSL_set_quic_early_data_enabled()

SSL_set_quic_early_data_enabled is not implemented by the QUIC OpenSSL wrapper.
Furthermore O-RTT is not supported by this wrapper. Do not know why at
this time.

23 months agoMINOR: quic: Set the QUIC connection as extra data before calling SSL_set_quic_method()
Frédéric Lécaille [Fri, 2 Jun 2023 15:00:04 +0000 (17:00 +0200)] 
MINOR: quic: Set the QUIC connection as extra data before calling SSL_set_quic_method()

This patch is required for the QUIC OpenSSL wrapper, and does not break anything
for the other TLS stacks with their own QUIC support (quictls for instance).

The implementation of SSL_set_quic_method() needs to access the quic_conn object
to store data within. But SSL_set_quic_method() is only aware of the SSL session
object. This is the reason why it is required to set the quic_conn object
as extra data to the SSL session object before calling SSL_set_quic_method()
so that it can be retrieve by SSL_set_quic_method().

23 months agoMINOR: quic: Do not enable O-RTT with USE_QUIC_OPENSSL_COMPAT
Frédéric Lécaille [Fri, 2 Jun 2023 14:51:43 +0000 (16:51 +0200)] 
MINOR: quic: Do not enable O-RTT with USE_QUIC_OPENSSL_COMPAT

Modify ssl_quic_initial_ctx() to disable O-RTT when the QUIC OpenSSL wrapper was
enabled.

23 months agoMINOR: quic: Include QUIC opensssl wrapper header from TLS stacks compatibility header
Frédéric Lécaille [Fri, 2 Jun 2023 14:44:03 +0000 (16:44 +0200)] 
MINOR: quic: Include QUIC opensssl wrapper header from TLS stacks compatibility header

Include haproxy/quic_openssl_compat.h from haproxy/openssl-compat.h when the
compilation of the QUIC openssl wrapper for TLS stacks is enabled with
USE_QUIC_OPENSSLCOMPAT.

23 months agoMINOR: quic: QUIC openssl wrapper implementation
Frédéric Lécaille [Fri, 2 Jun 2023 14:15:35 +0000 (16:15 +0200)] 
MINOR: quic: QUIC openssl wrapper implementation

Highly inspired from nginx openssl wrapper code.

This wrapper implement this list of functions:

   SSL_set_quic_method(),
   SSL_quic_read_level(),
   SSL_quic_write_level(),
   SSL_set_quic_transport_params(),
   SSL_provide_quic_data(),
   SSL_process_quic_post_handshake()

and SSL_QUIC_METHOD QUIC specific bio method which are also implemented by quictls
to support QUIC from OpenSSL. So, its aims is to support QUIC from a standard OpenSSL
stack without QUIC support. It relies on the OpenSSL keylog feature to retreive
the secrets derived by the OpenSSL stack during a handshake and to pass them to
the ->set_encryption_secrets() callback as this is done by quictls. It makes
usage of a callback (quic_tls_compat_msg_callback()) to handle some TLS messages
only on the receipt path. Some of them must be passed to the ->add_handshake_data()
callback as this is done with quictls to be sent to the peer as CRYPTO data.
quic_tls_compat_msg_callback() callback also sends the received TLS alert with
->send_alert() callback.

AES 128-bits with CCM mode is not supported at this time. It is often disabled by
the OpenSSL stack, but as it can be enabled by "ssl-default-bind-ciphersuites",
the wrapper will send a TLS alerts (Handhshake failure) if this algorithm is
negotiated between the client and the server.

0rtt is also not supported by this wrapper.

23 months agoBUG/MEDIUM: listener: Acquire proxy's lock in relax_listener() if necessary
Christopher Faulet [Thu, 20 Jul 2023 12:53:50 +0000 (14:53 +0200)] 
BUG/MEDIUM: listener: Acquire proxy's lock in relax_listener() if necessary

Listener functions must follow a common locking pattern:

  1. Get the proxy's lock if necessary
  2. Get the protocol's lock if necessary
  3. Get the listener's lock if necessary

We must take care to respect this order to avoid any ABBA issue. However, an
issue was introduced in the commit bcad7e631 ("MINOR: listener: add
relax_listener() function"). relax_listener() gets the lisener's lock and if
resume_listener() is called, the proxy's lock is then acquired.

So to fix the issue, the proxy's lock is first acquired in relax_listener(),
if necessary.

This patch should fix the issue #2222. It must be backported as far as 2.4
because the above commit is marked to be backported there.

23 months agoBUG/MINOR: server-state: Avoid warning on 'file not found'
Marcos de Oliveira [Thu, 20 Jul 2023 20:21:09 +0000 (17:21 -0300)] 
BUG/MINOR: server-state: Avoid warning on 'file not found'

On a clean installation, users might want to use server-state-file and
the recommended zero-warning option. This caused a problem if
server-state-file was not found, as a warning was emited, causing
startup to fail.

This will allow users to specify nonexistent server-state-file at first,
and dump states to the file later.

Fixes #2190

CF: Technically speaking, this patch can be backported to all stable
    versions. But it is better to do so to 2.8 only for now.

23 months agoBUG/MINOR: server-state: Ignore empty files
Marcos de Oliveira [Thu, 20 Jul 2023 20:21:10 +0000 (17:21 -0300)] 
BUG/MINOR: server-state: Ignore empty files

Users might want to pre-create an empty file for later dumping
server-states. This commit allows for that by emiting a notice in case
file is empty and a warning if file is not empty, but version is unknown

Fix partially: #2190

CF: Technically speaking, this patch can be backported to all stable
    versions. But it is better to do so to 2.8 only for now.

23 months agoMINOR: quic: Ping from Initial pktns before reaching anti-amplification limit
Frédéric Lécaille [Thu, 20 Jul 2023 14:35:42 +0000 (16:35 +0200)] 
MINOR: quic: Ping from Initial pktns before reaching anti-amplification limit

There are cases where there are enough room on the network to send 1200 bytes
into a PING only Initial packets. This may be considered as the last chance
for the connection to complete the handshake. Indeed, the client should
reply with at least a 1200 bytes datagram with an Initial packet inside.
This would give the haproxy endpoint a credit of 3600 bytes to complete
the handshake before reaching the anti-amplification limit again, and so on.

23 months agoBUG/MINOR: quic: Missing parentheses around PTO probe variable.
Frédéric Lécaille [Thu, 20 Jul 2023 13:45:41 +0000 (15:45 +0200)] 
BUG/MINOR: quic: Missing parentheses around PTO probe variable.

It is hard to analyze the impact of this bug. I guess it could lead a connection
to probe infinitively (with an exponential backoff probe timeout) during an handshake,
but one has never seen such a case.

Add missing parentheses around ->flags of the TX packet built by qc_do_build_pkt()
to detect that this packet embeds ack-eliciting frames. In this case if a probing
packet was needed the ->pto_probe value of the packet number space must be
decremented.

Must be backported as far as 2.6.

23 months agoMINOR: quic: add trace about pktns packet/frames releasing
Frédéric Lécaille [Mon, 17 Jul 2023 08:17:46 +0000 (10:17 +0200)] 
MINOR: quic: add trace about pktns packet/frames releasing

Add useful traces which have alredy helped in debugging issues.

23 months agoMINOR: quic: Add traces for qc_frm_free()
Frédéric Lécaille [Thu, 13 Jul 2023 16:40:03 +0000 (18:40 +0200)] 
MINOR: quic: Add traces for qc_frm_free()

Useful to diagnose memory leak issues in relation with the QUIC frame objects.

23 months agoMEDIUM: quic: Handshake I/O handler rework.
Frédéric Lécaille [Thu, 13 Jul 2023 12:44:04 +0000 (14:44 +0200)] 
MEDIUM: quic: Handshake I/O handler rework.

quic_conn_io_cb() is the I/O handler used during the handshakes. It called
qc_prep_pkts() after having called qc_treat_rx_pkts() to prepare datagrams
after having parsed incoming ones with branches to "next_level" label depending
on the connection state and if the current TLS session was a 0-RTT session
or not. The code doing that was ugly and not easy to maintain.

As qc_prep_pkts() is able to handle all the encryption levels available for
a connection, there is no need to keep this code.

After simplification, for now on, to be short, quic_conn_io_cb() called only one
time qc_prep_pkts() after having called qc_treat_rx_pkts().

Furthermore, there are more chances that this I/O handler could be reused for
the haproxy server side connections.

23 months agoCLEANUP: quic: Remove a useless TLS related variable from quic_conn_io_cb().
Frédéric Lécaille [Thu, 13 Jul 2023 09:56:36 +0000 (11:56 +0200)] 
CLEANUP: quic: Remove a useless TLS related variable from quic_conn_io_cb().

<ssl_err> was defined and used but its value is never modified after having
been initialized. It is definitively useless.

23 months agoMEDIUM: quic: Packet building rework.
Frédéric Lécaille [Tue, 11 Jul 2023 14:55:39 +0000 (16:55 +0200)] 
MEDIUM: quic: Packet building rework.

The aim of this patch is to allow the building of QUIC datagrams with
as much as packets with different encryption levels inside during handshake.
At this time, this is possible only for at most two encryption levels.
That said, most of the time, a server only needs to use two encryption levels
by datagram, except during retransmissions.

Modify qc_prep_pkts(), the function responsible of building datagrams, to pass
a list of encryption levels as parameter in place of two encryption levels. This
function is also used when retransmitting datagrams. In this case this is a
customized/flexible list of encryption level which is passed to this function.
Add ->retrans new member to quic_enc_level struct, to be used as attach point
to list of encryption level used only during retransmission, and ->retrans_frms
new member which is a pointer to a list of frames to be retransmitted.

23 months agoMINOR: quic: Add traces to qc_may_build_pkt()
Frédéric Lécaille [Tue, 11 Jul 2023 14:52:46 +0000 (16:52 +0200)] 
MINOR: quic: Add traces to qc_may_build_pkt()

This patch is very useful to debug issues in relation with the packets building.

23 months agoMINOR: quic: Release asap the negotiated Initial TLS context.
Frédéric Lécaille [Tue, 4 Jul 2023 09:09:25 +0000 (11:09 +0200)] 
MINOR: quic: Release asap the negotiated Initial TLS context.

This context may be released at the same time as the Initial TLS context.
This is done calling quic_tls_ctx_secs_free() and pool_free() in two code locations.
Implement quic_nictx_free() to do that.

23 months agoMINOR: quic: Dynamic allocation for negotiated Initial TLS cipher context.
Frédéric Lécaille [Tue, 4 Jul 2023 05:55:58 +0000 (07:55 +0200)] 
MINOR: quic: Dynamic allocation for negotiated Initial TLS cipher context.

Shorten ->negotiated_ictx quic_conn struct member (->nictx).
This variable is used during version negotiation. Indeed, a connection
may have to support support several QUIC versions of paquets during
the handshake. ->nictx is the QUIC TLS cipher context used for the negotiated
QUIC version.

This patch allows a connection to dynamically allocate this TLS cipher context.

Add a new pool (pool_head_quic_tls_ctx) for such QUIC TLS cipher context object.
Modify qc_new_conn() to initialize ->nictx to NULL value.
quic_tls_ctx_secs_free() frees all the secrets attached to a QUIC TLS cipher context.
Modify it to do nothing if it is called with a NULL TLS cipher context.
Modify to allocate ->nictx from qc_conn_finalize() just before initializing
its secrets. qc_conn_finalize() allocates -nictx only if needed (if a new QUIC
version was negotiated).
Modify qc_conn_release() which release a QUIC connection (quic_conn struct) to
release ->nictx TLS cipher context.

23 months agoMINOR: quic: Stop storing the TX encoded transport parameters
Frédéric Lécaille [Mon, 3 Jul 2023 16:12:47 +0000 (18:12 +0200)] 
MINOR: quic: Stop storing the TX encoded transport parameters

There is no need to keep an encoded version of the QUIC listener transport
parameters attache to the connection.

Remove ->enc_params and ->enc_params_len member of quic_conn struct.
Use variables to build the encoded transport parameter local to
ha_quic_set_encryption_secrets() before they are passed to
SSL_set_quic_transport_params().

Modify qc_ssl_sess_init() prototype. It was expected to be used with
the encoded transport parameters as passed parameter, but they were not
used. Cleanup this function.

23 months agoMINOR: peers: add peers keyword registration
Patrick Hemmer [Mon, 26 Jun 2023 18:43:48 +0000 (14:43 -0400)] 
MINOR: peers: add peers keyword registration

This adds support for registering keywords in the 'peers' section.

23 months agoBUG/MINOR: server: Don't warn on server resolution failure with init-addr none
Christopher Faulet [Thu, 20 Jul 2023 15:25:54 +0000 (17:25 +0200)] 
BUG/MINOR: server: Don't warn on server resolution failure with init-addr none

During startup, when the "none" method for "init-addr" is evaluated, a
warning is emitted if a resolution failure was previously encountered. The
documentation of the "none" method states it should be used to ignore server
resolution failures and let the server starts in DOWN state. However,
because a warning may be emitted, it is not possible to start HAProxy with
"zero-warning" option.

The same is true when "-dr" command line option is used. It is counter
intuitive and, in a way, this contradict what is specified in the
documentation.

So instead, a notice message is now emitted. At the end, if "-dr" command
line option is used or if "none" method is explicitly used, it means the
admin is agree with server resolution failures. There is no reason to emit a
warning.

This patch should fix the issue #2176. It could be backported to all stable
versions but backporting to 2.8 is probably enough for now.

23 months agoCLEANUP: config: make parse_cpu_set() return documented values
Willy Tarreau [Thu, 6 Jul 2023 13:21:43 +0000 (15:21 +0200)] 
CLEANUP: config: make parse_cpu_set() return documented values

parse_cpu_set() stopped returning the undocumented -1 which was a
leftover from an earlier attempt, changed from ulong to int since
it only returns a success/failure and no more a mask. Thus it must
not return -1 and its callers must only test for != 0, as is
documented.

23 months agoCLEANUP: cpuset: remove the unused proc_t1 field in cpu_map
Willy Tarreau [Thu, 6 Jul 2023 12:56:42 +0000 (14:56 +0200)] 
CLEANUP: cpuset: remove the unused proc_t1 field in cpu_map

This field used to store the cpumap of the first thread in a group, and
was used till 2.4 to hold some default settings, after which it was no
longer used. Let's just drop it.

23 months agoBUG/MINOR: init: set process' affinity even in foreground
Willy Tarreau [Wed, 19 Jul 2023 16:39:32 +0000 (18:39 +0200)] 
BUG/MINOR: init: set process' affinity even in foreground

The per-process CPU affinity settings are only applied during forking,
which means that cpu-map are ignored when running in foreground (e.g.
haproxy started with -db). This is historic due to the original semantics
of a process array, but isn't documented and causes surprises when trying
to debug affinity settings.

Let's make sure the setting is applied to the workers themselves even
in foreground. This may be backported to 2.6 though it is really not
important. If backported, it also depends on previous commit:

  BUG/MINOR: cpuset: remove the bogus "proc" from the cpu_map struct

23 months agoBUG/MINOR: cpuset: remove the bogus "proc" from the cpu_map struct
Willy Tarreau [Wed, 19 Jul 2023 16:17:39 +0000 (18:17 +0200)] 
BUG/MINOR: cpuset: remove the bogus "proc" from the cpu_map struct

We're currently having a problem with the porting from cpu_map from
processes to thread-groups as it happened in 2.7 with commit 5b09341c0
("MEDIUM: cpu-map: replace the process number with the thread group
number"), though it seems that it has deeper roots even in 2.0 and
that it was progressively made worng over time.

The issue stems in the way the per-process and per-thread cpu-sets were
employed over time. Originally only processes were supported. Then
threads were added after an optional "/" and it was documented that
"cpu-map 1" is exactly equivalent to "cpu-map 1/all" (this was clarified
in 2.5 by commit 317804d28 ("DOC: update references to process numbers
in cpu-map and bind-process").

The reality is different: when processes were still supported, setting
"cpu-map 1" would apply the mask to the process itself (and only when
run in the background, which is not documented either and is also a
bug for another fix), and would be combined with any possible per-thread
mask when calculating the threads' affinity, possibly resulting in empty
sets. However, "cpu-map 1/all" would only set the mask for the threads
and not the process. As such the following:

    cpu-map 1 odd
    cpu-map 1/1-8 even

would leave no CPU while doing:

    cpu-map 1/all odd
    cpu-map 1/1-8 even

would allow all CPUs.

While such configs are very unlikely to ever be met (which is why this
bug is tagged minor), this is becoming quite more visible while testing
automatic CPU binding during 2.9 development because due to this bug
it's much more common to end up with incorrect bindings.

This patch fixes it by simply removing the .proc entry from cpu_map and
always setting all threads' maps. The process is no longer arbitrarily
bound to the group 1's mask, but in case threads are disabled, we'll
use thread 1's mask since it contains the configured CPUs.

This fix should be backported at least to 2.6, but no need to insist if
it resists as it's easier to break cpu-map than to fix an unlikely issue.

23 months agoBUG/MINOR: config: do not detect NUMA topology when cpu-map is configured
Willy Tarreau [Tue, 18 Jul 2023 15:45:21 +0000 (17:45 +0200)] 
BUG/MINOR: config: do not detect NUMA topology when cpu-map is configured

As documented, the NUMA auto-detection is not supposed to be used when
the CPU affinity was set either by taskset (already checked) or by a
cpu-map directive. However this check was missing, so that configs
having cpu-map entries would still first bind to a single node. In
practice it has no impact on correct configs since bindings will be
replaced. However for those where the cpu-map directive are not
exhaustive it will have the impact of binding those threads to one node,
which disagrees with the doc (and makes future evolutions significantly
more complicated).

This could be backported to 2.4 where numa-cpu-mapping was added, though
if nobody encountered this by then maybe we should only focus on recent
versions that are more NUMA-friendly (e.g. 2.8 only). This patch depends
on this previous commit that brings the function we rely on:

   MINOR: cpuset: add cpu_map_configured() to know if a cpu-map was found

23 months agoMINOR: cpuset: add cpu_map_configured() to know if a cpu-map was found
Willy Tarreau [Tue, 18 Jul 2023 15:14:10 +0000 (17:14 +0200)] 
MINOR: cpuset: add cpu_map_configured() to know if a cpu-map was found

Since we'll soon want to adjust the "thread-groups" degree of freedom
based on the presence of cpu-map, we first need to be able to detect
if cpu-map was used. This function scans all cpu-map sets to detect if
any is present, and returns true accordingly.

23 months agoMINOR: lua: Allow reading "proc." scoped vars from LUA core.
Daan van Gorkum [Wed, 12 Jul 2023 05:11:24 +0000 (13:11 +0800)] 
MINOR: lua: Allow reading "proc." scoped vars from LUA core.

This adds the "core.get_var()" method allow the reading
of "proc." scoped variables outside of TXN or HTTP/TCPApplet.

Fixes: #2212
Signed-off-by: Daan van Gorkum <djvg@djvg.net>
23 months agoBUG/MINOR: h1-htx: Return the right reason for 302 FCGI responses
Christopher Faulet [Thu, 20 Jul 2023 07:50:56 +0000 (09:50 +0200)] 
BUG/MINOR: h1-htx: Return the right reason for 302 FCGI responses

A FCGI response may contain a "Location" header with no status code. In this
case a 302-Found HTTP response must be returned to the client. However,
while the status code is indeed 302, the reason is wrong. "Found" must be
set instead of "Moved Temporarily".

This patch must be backported as far as 2.2. With the commit e3e4e0006
("BUG/MINOR: http: Return the right reason for 302"), this should fix the
issue #2208.

23 months agoBUG/MINOR: hlua: add check for lua_newstate
firexinghe [Thu, 13 Jul 2023 03:03:34 +0000 (11:03 +0800)] 
BUG/MINOR: hlua: add check for lua_newstate

Calling lual_newstate(Init main lua stack) in the hlua_init_state()
function, the return value of lua_newstate() may be NULL (for example
in case of OOM). In this case, L will be NULL, and then crash happens
in lua_getextraspace(). So, we add a check for lua_newstate.

This should be backported at least to 2.4, maybe further.

23 months agoBUILD: quic: fix warning during compilation using gcc-6.5
Emeric Brun [Mon, 17 Jul 2023 16:33:44 +0000 (18:33 +0200)] 
BUILD: quic: fix warning during compilation using gcc-6.5

Building with gcc-6.5:

src/quic_conn.c: In function 'send_retry':
src/quic_conn.c:6554:2: error: dereferencing type-punned pointer will break
strict-aliasing rules [-Werror=strict-aliasing]
   *((uint32_t *)((unsigned char *)&buf[i])) = htonl(qv->num);

This patch use write_n32 to set the value.

This could be backported until v2.6

23 months agoBUG/MINOR: quic: Unckecked encryption levels availability
Frédéric Lécaille [Tue, 18 Jul 2023 09:44:06 +0000 (11:44 +0200)] 
BUG/MINOR: quic: Unckecked encryption levels availability

This bug arrived with this commit:

   MEDIUM: quic: Dynamic allocations of QUIC TLS encryption levels

It is possible that haproxy receives a late Initial packet after it has
released its Initial or Handshake encryption levels. In this case
it must not try to retransmit packets from such encryption levels to
speed up the handshake completion.

No need to backport.

23 months agoCI: explicitely highlight VTest result section if there's something
Ilya Shipitsin [Fri, 14 Jul 2023 22:00:49 +0000 (00:00 +0200)] 
CI: explicitely highlight VTest result section if there's something

it turned out that people miss VTest result section because it is not highlighted,
let us fix that

23 months agoCI: add naming convention documentation
Ilya Shipitsin [Fri, 14 Jul 2023 22:00:48 +0000 (00:00 +0200)] 
CI: add naming convention documentation

branches "haproxy-" stand for stable branches, otherwise development

23 months agoMEDIUM: ssl: new sample fetch method to get curve name
Mariam John [Mon, 17 Jul 2023 13:22:59 +0000 (08:22 -0500)] 
MEDIUM: ssl: new sample fetch method to get curve name

Adds a new sample fetch method to get the curve name used in the
key agreement to enable better observability. In OpenSSLv3, the function
`SSL_get_negotiated_group` returns the NID of the curve and from the NID,
we get the curve name by passing the NID to OBJ_nid2sn. This was not
available in v1.1.1. SSL_get_curve_name(), which returns the curve name
directly was merged into OpenSSL master branch last week but will be available
only in its next release.

23 months agoBUG/MINOR: http: Return the right reason for 302
Christopher Faulet [Mon, 17 Jul 2023 06:47:12 +0000 (08:47 +0200)] 
BUG/MINOR: http: Return the right reason for 302

Because of a cut/paste error, the wrong reason was returned for 302
code. The 301 reason was returned instead. Thus now, "Found" is returned for
302, instead of "Moved Permanently".

This pathc should fix the issue 2208. It must be backported to all stable
versions.

23 months agoBUG/MINOR: sample: Fix wrong overflow detection in add/sub conveters
Christopher Faulet [Mon, 17 Jul 2023 06:35:11 +0000 (08:35 +0200)] 
BUG/MINOR: sample: Fix wrong overflow detection in add/sub conveters

When "add" or "sub" conveters are used, an overflow detection is performed.
When 2 negative integers are added (or a positive integer is substracted to
a positive one), we take care to not exceed the low limit (LLONG_MIN) and
when 2 positive integers are added, we take care to not exceed the high
limit (LLONG_MAX).

However, because of a missing 'else' statement, if there is no overflow in
the first case, we fall back on the second check (the one for positive adds)
and LLONG_MAX is returned. It means that most of time, when 2 negative
integers are added (or a positive integer is substracted to a negative one),
LLONG_MAX is returned.

This patch should solve the issue #2216. It must be backported to all stable
versions.

23 months agoDOC: config: Fix fc_src description to state the source address is returned
Christopher Faulet [Mon, 17 Jul 2023 05:56:55 +0000 (07:56 +0200)] 
DOC: config: Fix fc_src description to state the source address is returned

A typo in the "fc_src" description was fixed. This sample returns the
original source IP address and not the destination one.

This patch should be backported as far as 2.6.

23 months agoBUG/MEDIUM: hlua_fcn/queue: bad pop_wait sequencing
Aurelien DARRAGON [Thu, 13 Jul 2023 08:47:33 +0000 (10:47 +0200)] 
BUG/MEDIUM: hlua_fcn/queue: bad pop_wait sequencing

I assumed that the hlua_yieldk() function used in queue:pop_wait()
function would eventually return when the continuation function would
return.

But this is wrong, the continuation function is simply called back by the
resume after the hlua_yieldk() which does not return in this case. The
caller is no longer the initial calling function, but Lua, so when the
continuation function eventually returns, it does not give the hand back
to the C calling function (queue:pop_wait()), like we're used to, but
directly to Lua which will continue the normal execution of the (Lua)
function that triggered the C-function, effectively bypassing the end
of the C calling function.

Because of this, the queue waiting list cleanup never occurs!

This causes some undesirable effects:
 - pop_wait() will slowly leak over the time, because the allocated queue
   waiting entry never gets deallocated when the function is finished
 - queue:push() will become slower and slower because the wait list will
   keep growing indefinitely as a result of the previous leak
 - the task that performed at least 1 pop_wait() could suffer from
   useless wakeups because it will stay indefinitely in the queue waiting
   list, so every queue:push() will try to wake the task, even if the
   task is not waiting for new queue items.
 - last but not least, if the task that performed at least 1 pop_wait ends
   or crashes, the next queue:push() will lead to invalid reads and
   process crash because it will try to wakeup a ghost task that doesn't
   exist anymore.

To fix this, the pop_wait function was reworked with the assumption that
the hlua_yieldk() with continuation function never returns. Indeed, it is
now the continuation function that will take care of the cleanup, instead
of the parent function.

This must be backported in 2.8 with 86fb22c5 ("MINOR: hlua_fcn: add Queue class")

23 months agoBUG/MINOR: hlua: hlua_yieldk ctx argument should support pointers
Aurelien DARRAGON [Thu, 13 Jul 2023 08:18:04 +0000 (10:18 +0200)] 
BUG/MINOR: hlua: hlua_yieldk ctx argument should support pointers

lua_yieldk ctx argument is of type lua_KContext which is typedefed to
intptr_t when available so it can be used to store pointers.

But the wrapper function hlua_yieldk() passes it as a regular it so it
breaks that promise.

Changing hlua_yieldk() prototype so that ctx argument is of type
lua_KContext.

This bug had no functional impact because ctx argument is not being
actively used so far. This may be backported to all stable versions
anyway.

2 years agoCLEANUP: quic: remove useless parameter 'key' from quic_packet_encrypt
Emeric Brun [Tue, 11 Jul 2023 12:53:41 +0000 (14:53 +0200)] 
CLEANUP: quic: remove useless parameter 'key' from quic_packet_encrypt

Parameter 'key' was not used in this function.

This patch removes it from the prototype of the function.

This patch could be backported until v2.6.

2 years agoBUG/MEDIUM: quic: timestamp shared in token was using internal time clock
Emeric Brun [Tue, 11 Jul 2023 14:13:19 +0000 (16:13 +0200)] 
BUG/MEDIUM: quic: timestamp shared in token was using internal time clock

The internal tick clock was used to export the timestamp int the token
on retry packets. Doing this in cluster mode the nodes don't
understand the timestamp from tokens generated by others.

This patch re-work this using the the real current date (wall-clock time).

Timestamp are also now considered in secondes instead of milleseconds.

This patch should be backported until v2.6

2 years agoBUG/MEDIUM: quic: missing check of dcid for init pkt including a token
Emeric Brun [Tue, 11 Jul 2023 12:57:54 +0000 (14:57 +0200)] 
BUG/MEDIUM: quic: missing check of dcid for init pkt including a token

RFC 9000, 17.2.5.1:
"The client MUST use the value from the Source Connection ID
field of the Retry packet in the Destination Connection ID
field of subsequent packets that it sends."

There was no control of this and we could accept a different
dcid on init packets containing a valid token.

The randomized value used as new scid on retry packets is now
added in the aad used to encode the token. This way the token
will appear as invalid if the dcid missmatch the scid of
the previous retry packet.

This should be backported until v2.6

2 years agoBUG/MINOR: quic: retry token remove one useless intermediate expand
Emeric Brun [Tue, 4 Jul 2023 12:56:08 +0000 (14:56 +0200)] 
BUG/MINOR: quic: retry token remove one useless intermediate expand

According to rfc 5869 about hkdf, extract function returns a
pseudo random key usable to perform expand using labels to derive keys.
So the intermediate expand on a label is useless, the key should be strong
enought using only one expand.

This patch should be backported until v2.6

2 years agoBUG/MEDIUM: quic: token IV was not computed using a strong secret
Emeric Brun [Mon, 3 Jul 2023 10:14:41 +0000 (12:14 +0200)] 
BUG/MEDIUM: quic: token IV was not computed using a strong secret

Computing the token key and IV, a stronger derived key was used
to compute the key but the weak secret was still used to compute
the IV. This could be used to found the secret.

This patch fix this using the same derived key than the one used
to compute the token key.

This should backport until v2.6

2 years agoBUG/MINOR: config: Lenient port configuration parsing
Thierry Fournier [Tue, 23 May 2023 16:00:46 +0000 (18:00 +0200)] 
BUG/MINOR: config: Lenient port configuration parsing

Configuration parsing allow port like 8000/websocket/. This is
a nonsense and allowing this syntax may hide to the user something
not corresponding to its intent.

This patch should not be backported because it could break existing
configurations

2 years agoBUG/MINOR: config: Remove final '\n' in error messages
Thierry Fournier [Tue, 23 May 2023 15:58:03 +0000 (17:58 +0200)] 
BUG/MINOR: config: Remove final '\n' in error messages

Because error messages are displayed with appending final '\n', it's
useless to add '\n' in the message.

This patch should be backported.

2 years agoBUG/MINOR: hlua_fcn/queue: use atomic load to fetch queue size
Aurelien DARRAGON [Tue, 11 Jul 2023 13:42:00 +0000 (15:42 +0200)] 
BUG/MINOR: hlua_fcn/queue: use atomic load to fetch queue size

In hlua_queue_size(), queue size is loaded as a regular int, but the
queue might be shared by multiple threads that could perform some
atomic pushing or popping attempts in parallel, so we better use an
atomic load operation to guarantee consistent readings.

This could be backported in 2.8.

2 years agoEXAMPLES: maintain haproxy 2.8 retrocompatibility for lua mailers script
Aurelien DARRAGON [Tue, 11 Jul 2023 09:32:55 +0000 (11:32 +0200)] 
EXAMPLES: maintain haproxy 2.8 retrocompatibility for lua mailers script

Because of b58bd97 ("MINOR: hlua_fcn/mailers: handle timeout mail from
mailers section"), latest examples/lua/mailers.lua file wouldn't work
if loaded with haproxy < 2.8.2 (which is not yet released), unless it
is manually recompiled from the latest code sources.

But this can be an issue given that direct URL may be referenced in
guides/tutorials as download link for the the script, independently
from the related haproxy source code revision.
ie: http://git.haproxy.org/?p=haproxy-2.8.git;a=blob_plain;f=examples/lua/mailers.lua;hb=HEAD

Thus, in order to make examples/lua/mailers.lua work with previous 2.8
versions, we ensure that the script stays compatible with pre-b58bd97
code by adding extra checks in the script.

This must be backported in 2.8 with b58bd97

2 years agoBUG/MINOR: sink/log: properly deinit srv in sink_new_from_logsrv()
Aurelien DARRAGON [Tue, 11 Jul 2023 07:31:06 +0000 (09:31 +0200)] 
BUG/MINOR: sink/log: properly deinit srv in sink_new_from_logsrv()

When errors are encountered in sink_new_from_logsrv() function,
incompetely allocated ressources are freed to prevent memory leaks.

For instance: logsrv implicit server is manually cleaned up on error prior
to returning from the function.

However, since 198e92a8e5 ("MINOR: server: add a global list of all known
servers") every server created using new_server() is registered to the
global list, but unfortunately the manual srv cleanup in
sink_new_from_logsrv() doesn't remove the srv from the global list, so the
freed server will still be referenced there, which can result in invalid
reads later.

Moreover, server API has evolved since, and now the srv_drop() function is
available for that purpose, so let's use it, but make sure that srv is
freed before the proxy because on older versions srv_drop() expects the
srv to be linked to a valid proxy pointer.

This must be backported up to 2.4.

[For 2.4 version, free_server() must be used instead of srv_drop()]

2 years agoMINOR: hlua_fcn/mailers: handle timeout mail from mailers section
Aurelien DARRAGON [Fri, 7 Jul 2023 14:55:43 +0000 (16:55 +0200)] 
MINOR: hlua_fcn/mailers: handle timeout mail from mailers section

As the example/lua/mailers.lua script does its best to mimic the c-mailer
implementation, it should support the "timeout mail" directive as well.

This could be backported in 2.8.

2 years agoBUG/MINOR: server: set rid default value in new_server()
Aurelien DARRAGON [Fri, 7 Jul 2023 13:19:36 +0000 (15:19 +0200)] 
BUG/MINOR: server: set rid default value in new_server()

srv->rid default value is set in _srv_parse_init() after the server is
succesfully allocated using new_server().

This is wrong because new_server() can be used independently so rid value
assignment would be skipped in this case.

Hopefully new_server() allocates server data using calloc() so srv->rid
is already set to 0 in practise. But if calloc() is replaced by malloc()
or other memory allocating function that doesn't zero-initialize srv
members, this could lead to rid being uninitialized in some cases.

This should be backported in 2.8 with 61e3894dfe ("MINOR: server: add
srv->rid (revision id) value")

2 years agoBUG/MINOR: sink: fix errors handling in cfg_post_parse_ring()
Aurelien DARRAGON [Mon, 10 Jul 2023 14:26:08 +0000 (16:26 +0200)] 
BUG/MINOR: sink: fix errors handling in cfg_post_parse_ring()

Multiple error paths (memory,IO related) in cfg_post_parse_ring() were
not implemented correcly and could result in memory leak or undefined
behavior.

Fixing them all at once.

This can be backported in 2.4

2 years agoBUG/MINOR: sink: invalid sft free in sink_deinit()
Aurelien DARRAGON [Mon, 10 Jul 2023 13:17:12 +0000 (15:17 +0200)] 
BUG/MINOR: sink: invalid sft free in sink_deinit()

sft freeing attempt made in a575421 ("BUG/MINOR: sink: missing sft free in
sink_deinit()") is incomplete, because sink->sft is meant to be used as a
list and not a single sft entry.

Because of that, the previous fix only frees the first sft entry, which
fixes memory leaks for single-server forwarders (this is the case for
implicit rings), but could still result in memory leaks when multiple
servers are configured in a explicit ring sections.

What this patch does: instead of directly freeing sink->sft, it iterates
over every list members to free them.

It must be backported up to 2.4 with a575421.

2 years agoBUG/MINOR: log: free errmsg on error in cfg_parse_log_forward()
Aurelien DARRAGON [Tue, 4 Jul 2023 13:36:45 +0000 (15:36 +0200)] 
BUG/MINOR: log: free errmsg on error in cfg_parse_log_forward()

When leaving cfg_parse_log_forward() on error paths, errmsg which is local
to the function could still point to valid data, and it's our
responsibility to free it.

Instead of freeing it everywhere it is invoved, we free it prior to
leaving the function.

This should be backported as far as 2.4.

2 years agoBUG/MINOR: log: fix multiple error paths in cfg_parse_log_forward()
Aurelien DARRAGON [Mon, 3 Jul 2023 16:33:18 +0000 (18:33 +0200)] 
BUG/MINOR: log: fix multiple error paths in cfg_parse_log_forward()

Multiple error paths were badly handled in cfg_parse_log_forward():
some errors were raised without interrupting the function execution,
resulting in undefined behavior.

Instead of fixing issues separately, let's fix the whole function at once.
This should be backported as far as 2.4.