Hi, HAProxy 2.4.19 was released on 2022/09/28. It added 63 new commits after version 2.4.18.
This release is very similar to the 2.5.9, released one week ago. There is only a bug about resolvers, fixed in this release, but too late to be shipped with the last 2.6 and 2.5 releases. It was possible to experience a crash because of a use-after-free when a resolution was released. When a resolution was aborted, it was not removed from the tree referencing all pending requests. Thus it was still possible to get a reference on a resolution in the same time it was released. For other bugs fixed in this release, here is a cut-pasted list from the 2.5.9 announce: * There was an issue with the log-forward section, where a missing initialization due to code duplication caused some settings from "bind" lines to be ignored (ssl, thread, a few such things). There was the same issue with ring. The sink initialization was performed too early. * It was possible to trigger the watchdog because of an extreme contention on the proxy's lock while the libc was in malloc()/free(). It was mainly due to the errors capture. A call to free() was under the lock with no special reason. The object is now released outside of the proxy's lock. * Some ugly crashes saying "offset > buf->data" were reported when using the DNS (e.g. issue #1781), and it was found that it was using uninitialized fields in a structure. A pool_zalloc() was used to paper over it, since it's not even impossible that others fields are affected and that this part requires a deep breath before being dived into. * There was a logic bug in processing of option http-restrict-req-hdr-names that could cause deletion of a wrong header or a crash when facing multiple forbidden chars. This was reported in issue #1822, analysed and fixed by Mateusz Malek. * Server-side idle connections were often left in TIME_WAIT due to an undesired shutdown() being performed before closing them, resulting in more outgoing ports being used than really necessary. * Aborting pipelined HTTP/1.1 transfers could sometimes result in a high CPU usage until the timeout stroke. * An old bug in the H2 mux may cause spurious stream resets when uploading and downloading at the same time from the same stream, due to the window update frames having to be delayed when the output is full, and sent later after the stream ID was reset. Those using POST to servers might have experienced such occasional issues and might want to check for any improvement there. This was reported in issue #1830 and diagnosed by David le Blanc. * During atomic map updates of entries based on prefix length ("_ip" and "_beg"), if a new finer entry was added and matched an input before being committed, it was naturally ignored, but the lookup would continue with next keys without rechecking the key, possibly returning an incorrect match. This was reported by Miroslav in issue #1802. * Tim reported in issue #1799 that upon reload, and old process that failed to synchronize its tables with the new one could loop for a while without any pause and waste a lot of CPU doing this. * Reloading peers could compete on the local one and slow down or block the replication. * Reloading peers could interrupt a resync in progress if the retry timer triggered before the end. * The recently added assertion in fd_delete() already spotted a long existing bug on reload, where the FD that was used by the pipe of an exiting thread could be instantly reused as a socket by another thread and be incorrectly inserted in the table. Most of the time it remained unnoticed as these were mostly health checks on a reloading process, but since the assertion a few users started to see logs of a crash of the exiting process. This was reported both by Christian Ruppert in issue #1807 and by Cedric Paillet. * Pause or resume a proxy from lua code could lead to some race because these operations were performed outside the proxy's lock. To fix the issue and prevent any trouble, the proxy's API was slightly refactored to be sure the proxy's lock is always acquired by low-level functions. * There was an undesired sharing of data between default-servers that could lead to double-frees concretized by crashes when checking the config. This was reported in issue #1804 by Fabiano Nunes. * The ring section's "size" parser was too lax and would take "1M" for "1" without even issuing a warning... Also error messages regarding incorrect values would copy the input string instead of the parsed value, providing no way to diagnose. * There was a bug in the SPOE. In sync or pipelining modes, an unhealthy SPOA could led HAProxy to create a huge number of applets to process queued messages, slowing down all processing. * Willy managed to trigger an error on reload where the old process died saying "t->tid >= 0 && t->tid != tid". This is caused by the deinit code that needs to stop stuff initialized on other threads, and as such it violates some consistency checks. The check was relaxed to ignore the stopping condition. * Characters escaping process in log messages was not correctly processing strings coming from sample fetches truncating the output string. * Using HAProxy built with PCRE2_JIT with a lib built without would fail to match. Now it will fall back to the regular match. * Agent-check could be delayed by ~200ms due to TCP QUICKACK being disabled by default. * Reading from the rings could also occasionally freeze at high rate if the reader had to stop due to a buffer full while the writer had already stopped due to a ring full. * In Lua, it was possible to hand reading HTTP payload (by line or not) from an HTTP applet because we relied on a transiant HTX flags to detect the end of the message instead of relying on the channel flag. * A 60s delay could be experienced after stopping HAProxy. This was happening when a signal was received before entering the poller and without any activity on the process. In mworker mode, if a worker exited and the SIGCHLD signal was delivered at the right time to the master, this one could be stuck for 60s. The timeout is now set to 0 in this specific case. * In master-worker mode, it was reported that HAProxy was consuming too much memory because of a too high maxconn value. To limit memory consumption, the master is now using a default maxconn value in wait-mode. * In HTTP/1.1, the matching between the authority and the Host header value for CONNECT requests was buggy. An exact match was performed ignoring any normalization on the port. For CONNECT request the authority must contain the port but it may be omitted from the host header value for default ports (80 or 443). The matching was fixed to properly handle this case. The following improvements were also backported: * Headers case adjustment in H1 is now available for TCP proxies. It was an issue for HTTP health-checks on backend side or for TCP connections upgraded to HTTP on frontend side. * The stats applet was reported paused frontends as OPEN. Now, these frontends are reported as PAUSED. * Encrypted password in Userlists are now supported on NetBSD Thanks everyone for your help and your contributions! 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.4/src/ Git repository : https://git.haproxy.org/git/haproxy-2.4.git/ Git Web browsing : https://git.haproxy.org/?p=haproxy-2.4.git Changelog : https://www.haproxy.org/download/2.4/src/CHANGELOG 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 : Aurelien DARRAGON (4): BUG/MEDIUM: proxy: ensure pause_proxy() and resume_proxy() own PROXY_LOCK MINOR: listener: small API change BUG/MINOR: stats: fixing stat shows disabled frontend status as 'OPEN' BUG/MINOR: log: improper behavior when escaping log data Brad Smith (1): BUILD: makefile: enable crypt(3) for NetBSD Christopher Faulet (25): MINOR: http: Add function to get port part of a host MINOR: http: Add function to detect default port BUG/MEDIUM: h1: Improve authority validation for CONNCET request MINOR: http-htx: Use new HTTP functions for the scheme based normalization MINOR: peers: Use a dedicated reconnect timeout when stopping the local peer BUG/MEDIUM: peers: limit reconnect attempts of the old process on reload BUG/MINOR: peers: Use right channel flag to consider the peer as connected BUG/MEDIUM: dns: Properly initialize new DNS session MINOR: server: Constify source server to copy its settings REORG: server: Export srv_settings_cpy() function BUG/MEDIUM: proxy: Perform a custom copy for default server settings BUG/MINOR: tcpcheck: Disable QUICKACK only if data should be sent after connect REGTESTS: Fix prometheus script to perform HTTP health-checks BUG/MEDIUM: spoe: Properly update streams waiting for a ACK in async mode BUG/MEDIUM: peers: Add connect and server timeut to peers proxy BUG/MEDIUM: peers: Don't use resync timer when local resync is in progress BUG/MEDIUM: peers: Don't start resync on reload if local peer is not up-to-date BUG/MINOR: hlua: Rely on CF_EOI to detect end of message in HTTP applets BUG/MINOR: tcpcheck: Disable QUICKACK for default tcp-check (with no rule) REGTESTS: http_request_buffer: Add a barrier to not mix up log messages BUG/MINOR: regex: Properly handle PCRE2 lib compiled without JIT support BUG/MINOR: h1: Support headers case adjustment for TCP proxies REGTESTS: healthcheckmail: Relax matching on the healthcheck log message REGTESTS: 4be_1srv_smtpchk_httpchk_layer47errors: Return valid SMTP replies BUG/MEDIUM: resolvers: Remove aborted resolutions from query_ids tree Emeric Brun (3): BUG/MAJOR: log-forward: Fix log-forward proxies not fully initialized BUG/MAJOR: mworker: fix infinite loop on master with no proxies. BUG/MEDIUM: sink: bad init sequence on tcp sink from a ring. Ilya Shipitsin (1): CI: cirrus-ci: bump FreeBSD image to 13-1 Mateusz Malek (1): BUG/MEDIUM: http-ana: fix crash or wrong header deletion by http-restrict-req-hdr-names Mathias Weiersmueller (1): DOC: fix TOC in starter guide for subsection 3.3.8. Statistics Matthias Wirth (1): BUG/MINOR: signals/poller: ensure wakeup from signals William Lallemand (6): BUG/MEDIUM: mworker: use default maxconn in wait mode BUG/MINOR: resolvers: return the correct value in resolvers_finalize_config() DOC: configuration: do-resolve doesn't work with a port in the string BUG/MINOR: signals/poller: set the poller timeout to 0 when there are signals REGTESTS: log: test the log-forward feature REGTESTS: ssl/log: test the log-forward with SSL Willy Tarreau (20): MINOR: ebtree: add ebmb_lookup_shorter() to pursue lookups BUG/MEDIUM: pattern: only visit equivalent nodes when skipping versions BUG/MINOR: ring/cli: fix a race condition between the writer and the reader BUG/MINOR: sink: fix a race condition between the writer and the reader BUILD: cfgparse: always defined _GNU_SOURCE for sched.h and crypt.h BUG/MEDIUM: poller: use fd_delete() to release the poller pipes BUG/MEDIUM: task: relax one thread consistency check in task_unlink_wq() BUILD: debug: silence warning on gcc-5 BUG/MEDIUM: ring: fix too lax 'size' parser BUILD: http: silence an uninitialized warning affecting gcc-5 BUG/MEDIUM: mux-h2: do not fiddle with ->dsi to indicate demux is idle BUG/MEDIUM: mux-h1: do not refrain from signaling errors after end of input BUG/MEDIUM: mux-h1: always use RST to kill idle connections in pools BUG/MINOR: mux-h2: fix the "show fd" dest buffer for the subscriber BUG/MINOR: mux-h1: fix the "show fd" dest buffer for the subscriber BUG/MINOR: mux-fcgi: fix the "show fd" dest buffer for the subscriber BUG/MINOR: task: always reset a new tasklet's call date BUG/MEDIUM: captures: free() an error capture out of the proxy lock BUILD: fd: fix a build warning on the DWCAS SCRIPTS: announce-release: update some URLs to https -- Christopher Faulet