Hi, HAProxy 2.6.7 was released on 2022/12/02. It added 156 new commits after version 2.6.6.
This release is quite huge. We were pretty busy the last 2 months, first because of the HAProxy Conf, then because of the 2.7.0. It was high time to release new stable versions. First of all, there is a pending fix not included in this release. It was first backported then reverted. It will be backported again just after the release and will be shipped with the 2.6.8. The aim is to not introduce issues for users waiting for this release for a long time. It is about the "set-uri" HTTP action. Its behavior will change. The URI will be sent to H1 server exactly as set by the action. So you must be careful to be aware of this change if you use it. You may use "set-path" or "set-pathq" actions instead if this new behavior is not welcome. Now about changes of the 2.6.7. This new release includes many QUIC fixes and improvements. I'm honestly unable to describe all the changes in this area. But it is worth noting that the QUIC stack is more or less the same than the one of the recently released 2.7.0. All known bugs were fixed and it should be fairly stable now. But it is still recommended to use per-thread listener if QUIC traffic is too high, to reduce the CPU consumption. From now, only bug fixes will be backported to 2.6. However the 2.7 should stay aligned on the 2.8-dev. So for any improvement, take a look at the 2.7 releases. Otherwise, here are the list of the main fixes: * Hash indexing on idle connections was fixed on 32-bit machines. The bug was due to an alignment issue causing the connection nodes to be indexed with their lower 32-bits set to zero and the higher 32 ones containing the 32 lower bits of the hash. * A major issue on sitck-tables were fixed about a possible crash if server name indexing is used to perform stickiness when the server is an applet. This is typically what happens when a "stick-store" rule is present in a backend featuring a "stats" directive. And at the end, to fix the bug, such rules must simply be ignored when the server is an applet. * A race condition on some global tasks was fixed. The stick-table expiration task and the listeners management task were concerned. These tasks may run on any thread. Both set their expiration date to TICK_ETERNITY. On the other hand, these task may be queued or scheduled from anywhere. The race was when the both happened at same time. Indeed it is forbidden to queue a task with no expiration date. To prevent any issue, a locking mechanism is now used. * The HTTP client was fixed at many places. A client was able to hang forever if end of the request was detected while the buffer is empty. It was possible to crash HAProxy with a lua HTTP client if the lua task timeout expired before the HTTP client. Another crash was also possible at the release stage because the applet context was not properly clean up. A crash during the parsing could be experienced if a relative URI was used instead of an absolute one. In addition to these fixes, the memory allocation for the SSL ca_file was fixed. * The HTTP compression filter was fixed to properly handle rewrite errors. Indeed, on rewrite error, the compression is not performed. But in this case, we must be sure to remove the "Content-Encoding" header. * The FCGI multiplexer was fixed to avoid overflow on the data length copied into a buffer when STDIN record is built. This could happen when the buffer was almost full and lead to a crash. * A race condition was fixed on the resolvers. it was possible to release a resolution on one thread when a response was processed for this resolution on another thread, leading to a crash because of a UAF issue. This was possible because the aborted resolutions were not removed from the query_ids tree. Thus, it was still possible to get a reference on an aborted resolution, which is totally unexpected. In addition, a very old bug was fixed about resolution on healthcheck failure. Indeed, it is documented a new resolution is triggered in this case but since the resolver refactoring performed in 2017, it was no longer true. * Now, low-level errors at the socket layer are not immediately reported if some data were received, to let a chance to the mux layer to handle received data first instead of immediately aborting. This should fix some spurious health-check failures. It is pretty hard to observe, but with a server immediately returning the response followed by a RST, without waiting the request, it is possible to have some health-check errors. * A crash was fixed when an error was encountered during the stream creation, for instance because of a lua filter initialization failure. The stream-endpoint descriptor was not properly reset, triggering a BUG_ON() when the multiplexer stream on the frontend side was destroyed. * A crash during ring section parsing was fixed. If a "ring" section initialization failed (e.g. due to a duplicate name, invalid chars, or missing memory), any subsequent "server" statement found in the same section crashed the config parser by dereferencing the currently NULL cfg_sink. * In peers, messages about unknown table was not properly ignored. Those messages are now silently ignored and the upper layer continue the processing as it is done for any valid messages * Several issues was fixed on the lua, mainly on the HTTPMessage class. HTTPMessage.remove() and HTTPMessage.insert() are now working as expected. In addition, Channel.insert() was fixed to be aligned with the documentation. Finally the argument parsing when sample fetches or converters are called from lua was fixed to avoid crashes on failure and to properly handle implicit stick-table. * The pgsql healthcheck was update to support new authentication methods. Now AUTH_REQ_GSS, AUTH_REQ_GSS and AUTH_REQ_SASL are supported. * On connection retry, Turn-around, adding 1 second pause before connection retry, is now enforce only when no redispatch is performed. * A memory leak was fixed when some TXN variables were defined from a tcp-request ruleset for an HTTP session. Indeed, in this case, these variables were lost because of an extra list initialization during the HTTP transaction creation. * smtpchk healthcheck now gracefully close SMTP transaction by sending a QUIT message. * Error handling during http replies parsing was fixed to prevent any crash during arguments parsing while a log-format body was expected but not evaluated yet. * And finally, to finish this boring list, the usual fixes here and there, documentation and build improvements. Thanks everyone for your help, your contributions and for your patience. A 2.5.10 should be quickly released. Probably on the next monday. And, later the next week, it should be the turn for the 2.4.20 and 2.2.26. 2.0 and 1.8 will be evaluated later. Please find the usual URLs below : Site index : https://www.haproxy.org/ Documentation : https://docs.haproxy.org/ Wiki : https://github.com/haproxy/wiki/wiki Discourse : https://discourse.haproxy.org/ Slack channel : https://slack.haproxy.org/ Issue tracker : https://github.com/haproxy/haproxy/issues Sources : https://www.haproxy.org/download/2.6/src/ Git repository : https://git.haproxy.org/git/haproxy-2.6.git/ Git Web browsing : https://git.haproxy.org/?p=haproxy-2.6.git Changelog : https://www.haproxy.org/download/2.6/src/CHANGELOG Dataplane API : https://github.com/haproxytech/dataplaneapi/releases/latest Pending bugs : https://www.haproxy.org/l/pending-bugs Reviewed bugs : https://www.haproxy.org/l/reviewed-bugs Code reports : https://www.haproxy.org/l/code-reports Latest builds : https://www.haproxy.org/l/dev-packages --- Complete changelog : Amaury Denoyelle (44): CLEANUP: mux-quic: remove usage of non-standard ull type CLEANUP: quic: remove global var definition in quic_tls header BUG/MINOR: quic: adjust quic_tls prototypes CLEANUP: quic: fix headers CLEANUP: quic: remove unused function prototype CLEANUP: quic: remove duplicated varint code from xprt_quic.h CLEANUP: quic: create a dedicated quic_conn module BUG/MINOR: mux-quic: ignore STOP_SENDING for locally closed stream MINOR: quic: limit usage of ssl_sock_ctx in favor of quic_conn MINOR: mux-quic: check quic-conn return code on Tx CLEANUP: quic: fix indentation MEDIUM: quic: retrieve frontend destination address BUG/MINOR: quic: set IP_PKTINFO socket option for QUIC receivers only CLEANUP: quic: remove unused rxbufs member in receiver CLEANUP: quic: improve naming for rxbuf/datagrams handling MINOR: quic: implement datagram cleanup for quic_receiver_buf BUILD: ssl_sock: fix null dereference for QUIC build BUG/MINOR: quic: fix buffer overflow on retry token generation MINOR: quic: add version field on quic_rx_packet MINOR: quic: extend pn_offset field from quic_rx_packet MINOR: quic: define first packet flag MINOR: quic: extract connection retrieval MINOR: quic: split and rename qc_lstnr_pkt_rcv() MINOR: quic: refactor packet drop on reception MINOR: quic: extend Retry token check function BUG/MINOR: mux-quic: complete flow-control for uni streams MINOR: quic: do not crash on unhandled sendto error MINOR: quic: display unknown error sendto counter on stat page MINOR: quic: remove unnecessary quic_session_accept() BUG/MINOR: quic: fix subscribe operation BUG/MINOR: quic: fix race condition on datagram purging BUILD: quic: fix dubious 0-byte overflow on qc_release_lost_pkts MINOR: ncbuf: complete doc for ncb_advance() BUG/MEDIUM: quic: fix unsuccessful handshakes on ncb_advance error BUG/MEDIUM: quic: fix memleak for out-of-order crypto data MINOR: quic: complete traces/debug for handshake DOC: configuration: fix quic prefix typo MINOR: quic: report error if force-retry without cluster-secret MINOR: global: generate random cluster.secret if not defined DOC: quic: add note on performance issue with listener contention BUG/MEDIUM: quic: fix datagram dropping on queueing failed CLEANUP: ncbuf: remove ncb_blk args by value CLEANUP: ncbuf: inline small functions CLEANUP: ncbuf: use standard BUG_ON with DEBUG_STRICT Aurelien DARRAGON (12): BUG/MINOR: hlua: fixing hlua_http_msg_del_data behavior BUG/MINOR: hlua: fixing hlua_http_msg_insert_data behavior BUG/MINOR: hlua: _hlua_http_msg_delete incorrect behavior when offset is used BUG/MINOR: hlua: hlua_channel_insert_data() behavior conflicts with documentation DOC: configuration: missing 'if' in tcp-request content example BUG/MINOR: log: fixing bug in tcp syslog_io_handler Octet-Counting BUG/MEDIUM: wdt/clock: properly handle early task hangs BUG/MINOR: http_ana/txn: don't re-initialize txn and req var lists BUG/MINOR: cfgparse-listen: fix ebpt_next_dup pointer dereference on proxy "from" inheritance BUG/MINOR: log: fix parse_log_message rfc5424 size check DOC: configuration.txt: add default_value for table_idle signature DOC: configuration.txt: fix typo in table_idle signature Christopher Faulet (31): REGTESTS: 4be_1srv_smtpchk_httpchk_layer47errors: Return valid SMTP replies BUG/MINOR: stream: Perform errors handling in right order in stream_new() BUG/MEDIUM: stconn: Reset SE descriptor when we fail to create a stream BUG/MEDIUM: resolvers: Remove aborted resolutions from query_ids tree DOC: config: Fix pgsql-check documentation to make user param mandatory BUG/MINOR: http-fetch: Update method after a prefetch in smp_fetch_meth() BUG/MINOR: mux-h1: Account consumed output data on synchronous connection error MINOR: smtpchk: Update expect rule to fully match replies to EHLO commands BUG/MEDIUM: httpclient: Don't set EOM flag on an empty HTX message MINOR: httpclient/lua: Don't set req_payload callback if body is empty BUG/MINOR: log: Preserve message facility when the log target is a ring buffer BUG/MINOR: ring: Properly parse connect timeout BUG/MEDIUM: compression: handle rewrite errors when updating response headers BUG/MINOR: sink: Only use backend capability for the sink proxies BUG/MINOR: sink: Set default connect/server timeout for implicit ring buffers BUG/MAJOR: stick-table: don't process store-response rules for applets BUG/MINOR: http-htx: Fix error handling during parsing http replies BUG/MINOR: resolvers: Don't wait periodic resolution on healthcheck failure BUG/MINOR: resolvers: Set port before IP address when processing SRV records BUG/MINOR: mux-fcgi: Be sure to send empty STDING record in case of zero-copy BUG/MEDIUM: mux-fcgi: Avoid value length overflow when it doesn't fit at once REG-TESTS: cache: Remove T-E header for 304-Not-Modified responses BUG/MEDIUM: listener: Fix race condition when updating the global mngmt task BUG/MEDIUM: raw-sock: Don't report connection error if something was received BUILD: peers: Remove unused variables BUG/MINOR: http-htx: Don't consider an URI as normalized after a set-uri action BUILD: http-htx: Silent build error about a possible NULL start-line BUILD: ssl-sock: Silent error about NULL deref in ssl_sock_bind_verifycbk() BUG/MINOR: mux-h1: Fix handling of 408-Request-Time-Out Revert "BUG/MINOR: http-htx: Don't consider an URI as normalized after a set-uri action" MINOR: mux-h1: add the expire task and its expiration date in "show fd" Emeric Brun (1): BUG/MEDIUM: peers: messages about unkown tables not correctly ignored Erwan Le Goas (1): BUG/MINOR: config: don't count trailing spaces as empty arg (v2) Fatih Acar (1): BUG/MINOR: checks: update pgsql regex on auth packet Frédéric Lécaille (11): MINOR: quic: New quic_cstream object implementation MINOR: quic: Extract CRYPTO frame parsing from qc_parse_pkt_frms() MINOR: quic: Use a non-contiguous buffer for RX CRYPTO data BUG/MINOR: quic: Stalled 0RTT connections with big ClientHello TLS message MINOR: quic: Split the secrets key allocation in two parts BUILD: ssl_sock: bind_conf uninitialized in ssl_sock_bind_verifycbk() BUILD: quic: QUIC mux build fix for 32-bit build BUILD: quic: Fix build for m68k cross-compilation BUG/MAJOR: quic: Crash upon retransmission of dgrams with several packets BUG/MAJOR: quic: Crash after discarding packet number spaces BUG/MINOR: quic: Endless loop during retransmissions Ilya Shipitsin (5): CI: SSL: use proper version generating when "latest" semantic is used CI: SSL: temporarily stick to LibreSSL=3.5.3 CI: add monthly gcc cross compile jobs CI: switch to the "latest" LibreSSL CI: enable QUIC for LibreSSL builds Mickael Torres (1): BUG/MINOR: mux-h1: Do not send a last null chunk on body-less answers Miroslav Zagorac (1): BUG/MINOR: httpclient: fixed memory allocation for the SSL ca_file Olivier Houchard (2): BUG/MEDIUM: lua: Don't crash in hlua_lua2arg_check on failure BUG/MEDIUM: lua: handle stick table implicit arguments right. Remi Tricot-Le Breton (3): BUG/MINOR: ssl: Memory leak of DH BIGNUM fields BUG/MINOR: ssl: Memory leak of AUTHORITY_KEYID struct when loading issuer BUG/MINOR: ssl: ocsp structure not freed properly in case of error Thierry Fournier (2): BUG/MINOR: hlua: Remove \n in Lua error message built with memprintf BUG/MEDIUM: httpclient: segfault when the httpclient parser fails Tim Duesterhus (2): CI: Replace the deprecated `::set-output` command by writing to $GITHUB_OUTPUT in matrix.py CI: Replace the deprecated `::set-output` command by writing to $GITHUB_OUTPUT in workflow definition William Lallemand (12): DOC: management: httpclient can resolve server names in URLs BUG/MEDIUM: httpclient/lua: crash when the lua task timeout before the httpclient BUG/MEDIUM: httpclient: check if the httpclient was released in the IO handler REGTESTS: httpclient/lua: test the lua task timeout with the httpclient CI: github: dump the backtrace of coredumps in the alpine container BUILD: Makefile: add "USE_SHM_OPEN" on the linux-musl target DOC: management: add forgotten "show startup-logs" DOC: lua: add a note about compression w/ httpclient BUG/MINOR: ssl: don't initialize the keylog callback when not required MINOR: ssl: enhance ca-file error emitting MINOR: ssl: forgotten newline in error messages on ca-file BUG/MINOR: ssl: shut the ca-file errors emitted during httpclient init Willy Tarreau (26): BUG/MAJOR: conn-idle: fix hash indexing issues on idle conns BUG/MINOR: backend: only enforce turn-around state when not redispatching BUILD: h1: silence an initiialized warning with gcc-4.7 and -Os MINOR: fd: add a new function to only raise RLIMIT_NOFILE MINOR: init: do not try to shrink existing RLIMIT_NOFIlE BUILD: http_fetch: silence an uninitiialized warning with gcc-4/5/6 at -Os BUG/MEDIUM: config: count line arguments without dereferencing the output CLEANUP: quic/receiver: remove the now unused tx_qring list BUG/MAJOR: stick-tables: do not try to index a server name for applets BUG/MINOR: server: make sure "show servers state" hides private bits BUG/MEDIUM: stick-table: fix a race condition when updating the expiration task CI: emit the compiler's version in the build reports DOC: config: fix alphabetical ordering of global section BUG/MEDIUM: ring: fix creation of server in uninitialized ring BUG/MINOR: pool/cli: use ullong to report total pool usage in bytes BUG/MINOR: server/idle: at least use atomic stores when updating max_used_conns BUILD: listener: fix build warning on global_listener_rwlock without threads DOC: config: provide some configuration hints for "http-reuse" DOC: config: refer to section about quoting in the "add_item" converter DOC: config: clarify the fact that SNI should not be used in HTTP scenarios DOC: config: mention that a single monitor-uri rule is supported DOC: config: explain how default matching method for ACL works DOC: config: clarify the fact that "retries" is not just for connections DOC: config: clarify the -m dir and -m dom pattern matching methods SCRIPTS: announce-release: add a link to the data plane API MINOR: mux-h2: add the expire task and its expiration date in "show fd" wrightlaw (1): BUG/MINOR: smtpchk: SMTP Service check should gracefully close SMTP transaction -- Christopher Faulet