Hi,

HAProxy 2.8.15 was released on 2025/04/22. It added 93 new commits
after version 2.8.14.

This version resyncs with the fixes that were part of 3.0.9 and 3.0.10
(and thanks again to Aurélien for dealing with this long series of
backports):

  - in API issue in the applets could have resulted in some shutdown or
    error conditions to be missed in the future, so as a prevention it
    was fixed. Turns out, after fixing this, it uncovered a bug in the
    CLI's "_getsocks" handler that was causing an infinite loop during
    reloads, and another one in the SPOE applet where the appled would
    never shut down (neither appeared in a released version), and these
    bug were also fixed.

  - reloads that transfer listening sockets to the new worker process could
    make the older worker consume a lot of CPU for no apparent reason for
    the time it remained present. The cause was that these FDs were
    registered in epoll and when a new connection arrived to the new
    process, the old one would also be notified without being able to
    unregister it since already closed (well-known epoll pitfall). Now
    these FDs are properly unregistered after being transfered so it's
    possible that some users with long-running old processes will observe
    a lower CPU usage on these old processes.

  - a BUG_ON() could be triggered when using filters with no http_payload
    callback.

  - a bug in htx_xfer_blks() could result in occasionally transfering more
    blocks than requested on 32-bit platforms.

  - some TLSv1.3 signature algorithms were not recognized by the
    ClientHello parser which was written before TLSv1.3. The ones that
    were not correctly supported were based on RSA-PSS and would have
    resulted in presenting a possibly wrong certificate when both RSA and
    ECDSA ones were present for the same SNI.

  - disabling the send-proxy-v2 feature on a "server" line after some fields
    had been enabled in the defaults section would result in an attempt to
    send a PROXY-v1 line because the presence of any field was tested to
    decide to send the PROXY header.
  
  - a startup race can randomly affect the setting of CPU affinity of
    certain threads during boot, if the thread starts faster than the
    parent updates the pthread identifier upon return. When it happens,
    the affinity setting will often be silently ignored, but on some libs
    such as musl, it can also result in a segfault at boot.
  
  - a use-after-free condition was occasionally possible in Lua applets
    handling CLI keywords, causing random crashes. It was apparently
    difficult to trigger and did apparently not happen before 3.0.

  - a possible crash was possible due to an assert condition on the purge
    of QUIC streams depending on the ordering of received RESET_STREAM and
    STOP_SENDING frames.

  - SPOE applets could be woken in loops during stopping, thus eating a lot
    of CPU until the process stopped.

  - transparent proxy connections at the proxy level ("option transparent")
    would not include the destination address in the connection hash
    calculation, meaning that idle connections for a different address
    than expected could be reused between requests.
    
  - usesrc clientip would accidentally include the client's port in the
    hash calculation, resulting in a very low connection reuse ratio.

  - leading and trailing spaces are now properly trimmed from both h2 and
    h3 header values. In h2 it had been observed that some rare clients
    keep the space after the comma when splitting "cookie" values, causing
    errors between haproxy and servers, so we can reasonably expect that
    this would happen with h3 too if the same clients support both
    protocols. In addition, he H3 header sanitization was synchronized
    with the latest fixes applied to H2 (filter "upgrade", block invalid
    chars in URI, etc).

  - TCP/HTTP Lua applets could lose some data when yielding.

  - HTTP/1 uploads over reused connections facing a server close (e.g.
    keep-alive timeout) could still return a 502 instead of silently
    closing if the close was detected while uploading the payload. This
    has been seen to cause occasional 502 with short PUT requests on
    servers with a short keep-alive timeout. It's now handled correctly
    and may even be eligible to L7 retries in case the payload fits
    entirely in the buffer.

  - an assertion could be violated in QUIC, causing a crash, if an invalid
    request is received after the mux had emitted a STOP_SENDING frame.

  - stick-tables could learn entries from peers with an expiration date
    further in the future than what their own expire time permits, causing
    entries resulting from a temporary misconfiguration to be very
    difficult to evict from a cluster (e.g. mistakenly write "24d" instead
    of "24h" and entries persist for 3 weeks even across reloads). Now the
    entries' expiration date will be capped to the stick table's setting.

  - the regsub converter, used to perform regex-based substitutions, would
    check the remaining room in the buffer against the initially available
    size for each replaced pattern instead of checking it against the
    remaining size. This was reported by Aleandro Prudenzano of Doyensec
    and Edoardo Geraci of Codean Labs, and was assigned CVE-2025-32464.
    The risk is quite low since such configs are quite unlikely and in the
    rare cases they will happen, the replacement will involve static
    contents, thus essentially a risk of crash.

And there were a few other less important ones among which:

  - a few issues on the peers section parser and config consistency checker
    possibly causing issues or even a segfault.

  - servers attached to a ring wouldn't wait before trying to reconnect,
    causing connection storms in case of a server failure.

  - the H1 mux and general streams were made more robust against dumps
    from a signal handler, by not keeping unallocated pointers visible
    and making sure certain objects still exist before being displayed.

  - a few minor memory leaks were found in error paths (auth, _getsock,
    flt-trace)

  - only one "users" option in userlist "group" directive is supported,
    but extraneous ones were still accepted and silently leaked, which
    is no longer the case (an alert is now displayed when "users" is
    repeated).

  - FCGI would always force the status to 302 when seeing a Location
    header, possibly overwriting another status code.

  - H1 responses truncated after a chunk boundary (i.e. only missing the
    0-sized chunk) forwarded to H2 could end up with a clean END_STREAM
    flag instead of an RST_STREAM(CANCEL). The difference is subtle,
    because the former states that the transfer was complete while the
    latter says it was interrupted. In the first case, a client would
    consider the object as complete (i.e. it could display a broken image)
    while for the latter the client might possibly decide to try again.

  - a few crashes could happen in the QUIC mux failed to initialize.

  - some QUIC crypto frames could be 1 to 2 bytes smaller than permitted
    by the MTU. Also, related to packet length, some packets can use a
    long header, and some room could be missing in the buffer to store
    their length field, resulting in errors.

  - the signature algorithms were not listed on "show ssl crt-list". They
    now are.

  - a pending close from the server could be forwarded to the client
    despite a pending tcp-response content evaluation.

  - the Lua could possibly crash due to a risk of use-after-free in the
    Queue API if a resource allocation error happened on the consumption
    side and the other side would still push into it.

  - in certain rare cases (timing dependent), certain client aborts that
    are forwarded to the server could be logged as server aborts ("SD")
    instead of client aborts ("CD") depending on which side was checked
    first when deciding on the final state.

  - one case where QUIC could crash on out-of-memory condition when trying
    to allocate CRYPTO buffers was addressed. It could be triggered in
    memory-constrained environments (i.e. containers). This fix was also
    added to 3.1 after the release.

Since this one accumulates almost 3 months worth of fixes, I think there
are a bit for everyone in it. There's nothing critical though. I'd suggest
that all 2.8 users start to plan for testing it on a rainy day and updating
once the tests are conclusive.

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.8/src/
   Git repository   : https://git.haproxy.org/git/haproxy-2.8.git/
   Git Web browsing : https://git.haproxy.org/?p=haproxy-2.8.git
   Changelog        : https://www.haproxy.org/download/2.8/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

Willy
---
Complete changelog :
Amaury Denoyelle (19):
      BUG/MEDIUM: mux-quic: do not attach on already closed stream
      MINOR: mux-quic: change return value of qcs_attach_sc()
      BUG/MINOR: mux-quic: handle closure of uni-stream
      BUG/MINOR: quic: reserve length field for long header encoding
      BUG/MINOR: quic: fix CRYPTO payload size calcul for encoding
      BUG/MINOR: quic: prevent crash on conn access after MUX init failure
      CLEANUP: h3: fix documentation of h3_rcv_buf()
      BUG/MEDIUM: mux-quic: fix crash on RS/SS emission if already close local
      BUG/MINOR: mux-quic: remove extra BUG_ON() in _qcc_send_stream()
      BUG/MINOR: backend: do not overwrite srv dst address on reuse
      BUG/MEDIUM: backend: fix reuse with set-dst/set-dst-port
      BUG/MEDIUM: h3: trim whitespaces when parsing headers value
      BUG/MEDIUM: h3: trim whitespaces in header value prior to QPACK encoding
      BUG/MINOR: h3: filter upgrade connection header
      BUG/MINOR: h3: reject invalid :path in request
      BUG/MINOR: h3: reject request URI with invalid characters
      BUG/MINOR: mux-quic: fix BUG_ON() crash on init failure after app-ops
      BUG/MINOR: quic: do not crash on CRYPTO ncbuf alloc failure
      BUG/MINOR: mux-h2: prevent past scheduling with idle connections

Aurelien DARRAGON (17):
      DOC: config: reorder "tune.lua.*" keywords by alphabetical order
      DOC: config: add "tune.lua.burst-timeout" to the list of global parameters
      DOC: management: rename some last occurences from domain "dns" to 
"resolvers"
      BUG/MINOR: sink: add tempo between 2 connection attempts for sft servers
      MINOR: clock: always use atomic ops for global_now_ms
      BUG/MINOR: cfgparse/peers: fix inconsistent check for missing peer server
      BUG/MINOR: cfgparse/peers: properly handle ignored local peer case
      BUG/MINOR: server: dont return immediately from parse_server() when 
skipping checks
      MINOR: cfgparse/peers: provide more info when ignoring invalid "peer" or 
"server" lines
      BUG/MEDIUM: hlua/cli: fix cli applet UAF in hlua_applet_wakeup()
      MINOR: task: add thread safe notification_new and notification_wake 
variants
      BUG/MINOR: hlua_fcn: fix potential UAF with Queue:pop_wait()
      BUG/MINOR: hlua: fix invalid errmsg use in hlua_init()
      BUG/MINOR: sink: add tempo between 2 connection attempts for sft servers 
(2)
      BUG/MINOR: backend: fix reuse with set-dst/set-dst-port (2)
      BUG/MEDIUM: backend: do not overwrite srv dst address on reuse (2)
      BUG/MEDIUM: hlua: fix hlua_applet_{http,tcp}_fct() yield regression (lost 
data)

Christopher Faulet (17):
      BUG/MINOR: spoe: Check the shared waiting queue to shut applets during 
stopping
      BUG/MINOR: spoe: Allow applet creation when closing the last one during 
stopping
      BUG/MEDIUM: spoe: Don't wakeup idle applets in loop during stopping
      REGTESTS: Fix truncated.vtc to send 0-CRLF
      BUG/MINOR: cli: Wait for the last ACK when FDs are xferred from the old 
worker
      BUG/MEDIUM: filters: Handle filters registered on data with no payload 
callback
      BUG/MINOR: fcgi: Don't set the status to 302 if it is already set
      BUG/MINOR: tcp-rules: Don't forward close during tcp-response content 
rules eval
      BUG/MINOR: cli: Fix memory leak on error for _getsocks command
      BUG/MINOR: cli: Fix a possible infinite loop in _getsocks()
      BUG/MINOR: config/userlist: Support one 'users' option for 'group' 
directive
      BUG/MINOR: auth: Fix a leak on error path when parsing user's groups
      BUG/MINOR: flt-trace: Support only one name option
      BUG/MINOR: stats-json: Define JSON_INT_MAX as a signed integer
      BUG/MINOR: http-ana: Properly detect client abort when forwarding the 
response
      BUG/MEDIUM: http-ana: Report 502 from req analyzer only during rsp 
forwarding
      BUG/MINOR: mux-h2: Properly handle full or truncated HTX messages on shut

Dragan Dosen (1):
      BUG/MINOR: server: fix the "server-template" prefix memory leak

Emeric Brun (2):
      BUG/MINOR: peers: fix expire learned from a peer not converted from ms to 
ticks
      BUG/MEDIUM: peers: prevent learning expiration too far in futur from 
unsync node

Ilia Shipitsin (1):
      BUG/MINOR: namespace: handle a possible strdup() failure

Lukas Tribus (1):
      DOC: option redispatch should mention persist options

Olivier Houchard (1):
      TESTS: Fix build for filltab25.c

Valentine Krasnobaeva (3):
      BUG/MINOR: cfgparse: fix NULL ptr dereference in cfg_parse_peers
      BUG/MEIDUM: startup: return to initial cwd only after 
check_config_validity()
      BUG/MINOR: log: fix gcc warn about truncating NUL terminator while init 
char arrays

William Lallemand (6):
      BUG/MEDIUM: ssl: chosing correct certificate using RSA-PSS with TLSv1.3
      BUG/MEDIUM: htx: wrong count computation in htx_xfer_blks()
      DOC: htx: clarify <mark> parameter for htx_xfer_blks()
      TESTS: ist: fix wrong array size
      BUG/MINOR: ssl/cli: "show ssl crt-list" lacks client-sigals
      BUG/MINOR: ssl/cli: "show ssl crt-list" lacks sigals

Willy Tarreau (25):
      BUG/MEDIUM: clock: make sure now_ms cannot be TICK_ETERNITY
      BUG/MEDIUM: fd: mark FD transferred to another process as FD_CLONED
      BUG/MEDIUM: thread: use pthread_self() not ha_pthread[tid] in set_affinity
      BUG/MEDIUM: debug: close a possible race between thread dump and panic()
      BUG/MINOR: mux-h1: always make sure h1s->sd exists in h1_dump_h1s_info()
      MINOR: tinfo: add a new thread flag to indicate a call from a sig handler
      BUG/MINOR: h2: always trim leading and trailing LWS in header values
      BUG/MINOR: server: check for either proxy-protocol v1 or v2 to send hedaer
      MINOR: compiler: add a simple macro to concatenate resolved strings
      BUILD: compiler: undefine the CONCAT() macro if already defined
      MINOR: compiler: add a new __decl_thread_var() macro to declare local 
variables
      MINOR: tools: resolve main() only once in resolve_sym_name()
      MINOR: tools: use only opportunistic symbols resolution
      BUILD: tools: silence a build warning when USE_THREAD=0
      MINOR: cli: export cli_io_handler() to ease symbol resolution
      MINOR: tools: improve symbol resolution without dl_addr
      MINOR: tools: ease the declaration of known symbols in resolve_sym_name()
      MINOR: tools: teach resolve_sym_name() a few more common symbols
      BUILD: tools: avoid a build warning on gcc-4.8 in resolve_sym_name()
      DOC: config: fix two missing "content" in "tcp-request" examples
      BUG/MEDIUM: sample: fix risk of overflow when replacing multiple regex 
back-refs
      BUG/MINOR: backend: do not use the source port when hashing clientip
      DOC: config: add the missing "profiling.memory" to the global kw index
      BUG/MINOR debug: fix !USE_THREAD_DUMP in ha_thread_dump_fill()
      MINOR: tools: also protect the library name resolution against concurrent 
accesses

---


Reply via email to