Hi,

HAProxy 2.8.6 was released on 2024/02/15. It added 88 new commits after
version 2.8.5. It essentially groups the relevant fixes present in 2.9.2
to 2.9.5, most importantly:
  - an API issue with OpenSSL. The SSL_do_handshake() function returns
    SSL_ERROR_WANT_READ when it needs more data, but in certain obscure
    circumstances related to internal error handling, it was found that
    it may stop trying to read available data and continue to return that
    status! This results in wakeup loops that prevent the process from
    sleeping, hence it consumes 100% of the CPU (but it's still working
    fine). The code does what the doc suggests (but the doc is basically
    a one-liner), and neither aws-lc nor wolfSSL exhibit this problem.

  - the QUIC compatibility layer didn't support setting the client
    hello callback that's needed to extract some information from the
    incoming connection.

  - another QUIC issue whereby the some streams reset with pending outgoing
    data may clog the output buffer until the connection closes, possibly
    causing the connection to slow down or even stall.

  - a possible crash in the QPACK encoder when encoding HTTP/3 responses
    carrying status codes above 599.

  - the HTTP/1 chunk and header parsers were strengthened a bit. Indeed,
    Ben Kallus kindly reminded us that we would still accept the NUL byte
    in header values and plain LF in chunks, while we were (wrongly) quite
    certain that these had long been rejected. Ben is currently not aware
    of situations where this could help convey an attack to any existing
    component, but given the surprises he certainly faces in his reviews,
    it's probably only a matter of time before one implementation shows to
    be too weak and we fail to properly protect it. So it was better to
    address both at once. In the extremely unlikely case that anyone would
    discover such an invalid byte on their network with an application that
    heavily relies on it, option accept-invalid-http* will work as usual to
    bypass the check. We'll backport that to older versions as well, and I
    think it would be prudent for distros to take that as well.

  - A new global setting was added to the H2 multiplexer to limit the
    total number of H2 streams per client connection. To do so,
    'tune.h2.fe.max-total-streams' can now be used.  It sets the HTTP/2
    maximum number of total streams processed per incoming
    connection. Once this limit is reached, HAProxy will send a graceful
    GOAWAY frame informing the client that it will close the connection
    after all pending streams have been closed. In practice, clients tend
    to close as fast as possible when receiving this, and to establish a
    new connection for next requests. Doing this is sometimes useful and
    desired in situations where clients stay connected for a very long
    time and cause some imbalance inside a farm. For example, in some
    highly dynamic environments, it is possible that new load balancers
    are instantiated on the fly to adapt to a load increase, and that
    once the load goes down they should be stopped without breaking
    established connections. By setting a limit here, the connections
    will have a limited lifetime and will be frequently renewed, with
    some possibly being established to other nodes, so that existing
    resources are quickly released. Of course nothing changes by default
    when not touching this setting.

  - an interesting arch-specific bug in the JWT parser: by initializing
    a 64-bit variable a bit too early, everything was fine on 64-bit
    platforms, but on 32-bit ones, a pointer located closer to the
    beginning of the structure got reset by this initialization before it
    was used, causing a crash! The fact this was only noticed now by running
    VTest on a 32-bit platform just shows that 32-bit users are less common
    these days and that their configs are probably simple enough not to use
    JWT ;-)

  - a rare deadlock was found on the pools code, it can be triggered at
    stopping time and crash the old process. It's been there since 2.5,
    and is difficult to trigger, but a user faced it and that's how we
    learned about it (GH issue #2427, thanks to user @JB0925).

  - we finished our round of analysis, documentation and fixes for the
    QUIC congestion control code and figured a few causes of corner cases
    that can occasionally cause more performance degradation than expected,
    especially on the loss detection and reordering part. For this, a new
    global setting "tune.quic.reorder-ratio" allows to indicate what portion
    of the in flight window can appear to be reordered before declaring a
    loss. There's now a separate counter per connection for the reordered
    packets that will help us figure what's happening. Tests on degraded
    networks showed a x10 performance increase with the new default setting.

  - some more CLI commands were found to occasionally miss the trailing
    line feed, possibly confusing scripts and APIs. These were corrected,
    and a more general fix was applied to the command line processor to
    make sure each command always finishes with exactly one LF.

  - the status of agent checks is returned as-is in the stats CSV output,
    resulting in mangling the CLI's output if it contains line feeds. It
    has been there since 2.0.

  - an OCSP update reference counting issue was fixed, which was apparently
    causing some certificates to reference a just freed OCSP response. Also
    on errors, the reported message from the OCSP updater was confusing
    (this one is in issue #2432, thanks to Frank Wall for the report).

  - when deleting a crt-list line from the CLI, a dangling pointer reference
    could be left, with the possible effect of causing a crash. Apparently
    it has been the case since 2.4 so it seems that not that many people
    use "del ssl crt-list" or that the occurrence is quite rare.

  - the diag warnings (enabled using -dD) were not all run when checking
    a config with "-c"! One would have to explicitly try to start the config
    to run the last ones. The only missing ones were the duplicate server
    cookie check.

  - and a few other low-importance stuff and doc updates.

  - Abhijeet Rastogi found that we still didn't recommend to the PCRE2 over
    PCRE that's no longer maintained. It was just an overlook and the doc
    was updated.

  - and the usual CI updates (support for cache API v4, thanks to Tim), doc
    cleanups and updates. 

And I think that's all. There is no emergency in deploying this version,
but it contains a significant number of quite annoying bugs that are hard
to troubleshoot, so I would really appreciate it if we soon see this one
replace all other existing 2.8.

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 :
Abhijeet Rastogi (1):
      DOC: install: recommend pcre2

Amaury Denoyelle (15):
      BUG/MINOR: mux-quic: always report error to SC on RESET_STREAM emission
      MINOR: h3: check connection error during sending
      BUG/MINOR: h3: close connection on header list too big
      BUG/MINOR: h3: properly handle alloc failure on finalize
      BUG/MINOR: h3: close connection on sending alloc errors
      BUG/MEDIUM: h3: fix incorrect snd_buf return value
      BUG/MINOR: mux-quic: do not prevent non-STREAM sending on flow control
      BUG/MINOR: h3: fix checking on NULL Tx buffer
      BUG/MEDIUM: mux-quic: report early error on stream
      MINOR: quic: extract qc_stream_buf free in a dedicated function
      BUG/MEDIUM: quic: remove unsent data from qc_stream_desc buf
      MINOR: h3: add traces for stream sending function
      BUG/MEDIUM: h3: do not crash on invalid response status code
      BUG/MEDIUM: qpack: allow 6xx..9xx status codes
      BUG/MEDIUM: quic: fix crash on invalid qc_stream_buf_free() BUG_ON

Aurelien DARRAGON (5):
      MINOR: stats: store the parent proxy in stats ctx (http)
      BUG/MEDIUM: stats: unhandled switching rules with TCP frontend
      REGTESTS: add a test to ensure map-ordering is preserved
      BUG/MINOR: ext-check: cannot use without preserve-env
      DEV: makefile: fix POSIX compatibility for "range" target

Christopher Faulet (8):
      BUG/MEDIUM: mux-h2: Report too large HEADERS frame only when rxbuf is 
empty
      DOC: config: Update documentation about local haproxy response
      BUG/MEDIUM: stconn: Forward shutdown on write timeout only if it is 
forwardable
      BUG/MEDIUM: spoe: Never create new spoe applet if there is no server up
      BUG/MEDIUM: stconn: Allow expiration update when READ/WRITE event is 
pending
      BUG/MEDIUM: stconn: Don't check pending shutdown to wake an applet up
      BUG/MINOR: h1: Don't support LF only at the end of chunks
      BUG/MEDIUM: h1: Don't support LF only to mark the end of a chunk size

Emeric Brun (1):
      BUG/MEDIUM: cli: some err/warn msg dumps add LR into CSV output on stat's 
CLI

Frederic Lecaille (11):
      BUG/MEDIUM: quic: keylog callback not called (USE_OPENSSL_COMPAT)
      CLEANUP: quic: Remove unused CUBIC_BETA_SCALE_FACTOR_SHIFT macro.
      MINOR: quic: Stop hardcoding a scale shifting value 
(CUBIC_BETA_SCALE_FACTOR_SHIFT)
      BUG/MINOR: quic: Wrong ack ranges handling when reaching the limit.
      CLEANUP: quic: Code clarifications for QUIC CUBIC (RFC 9438)
      BUG/MINOR: quic: fix possible integer wrap around in cubic window 
calculation
      MINOR: quic: Stop using 1024th of a second.
      BUG/MEDIUM: quic: Wrong K CUBIC calculation.
      MINOR: quic: Update K CUBIC calculation (RFC 9438)
      MINOR: quic: Dynamic packet reordering threshold
      MINOR: quic: Add a counter for reordered packets

Frédéric Lécaille (5):
      BUG/MEDIUM: quic: Possible buffer overflow when building TLS records
      BUG/MEDIUM: quic: QUIC CID removed from tree without locking
      BUG/MINOR: quic: Wrong keylog callback setting.
      BUG/MINOR: quic: Missing call to TLS message callbacks
      CLEANUP: quic: Remaining useless code into server part

Lukas Tribus (1):
      DOC: httpclient: add dedicated httpclient section

Miroslav Zagorac (1):
      DOC: configuration: corrected description of keyword 
tune.ssl.ocsp-update.mindelay

Olivier Houchard (1):
      BUG/MAJOR: ssl_sock: Always clear retry flags in read/write functions

Remi Tricot-Le Breton (10):
      BUG/MINOR: ssl: Fix error message after ssl_sock_load_ocsp call
      BUG/MINOR: ssl: Duplicate ocsp update mode when dup'ing ckch
      BUG/MINOR: ssl: Clear the ckch instance when deleting a crt-list line
      MINOR: ssl: Use OCSP_CERTID instead of ckch_store in 
ckch_store_build_certid
      BUG/MEDIUM: ocsp: Separate refcount per instance and per store
      BUG/MINOR: ssl: Destroy ckch instances before the store during deinit
      BUG/MINOR: ssl: Reenable ocsp auto-update after an "add ssl crt-list"
      REGTESTS: ssl: Fix empty line in cli command input
      REGTESTS: ssl: Add OCSP related tests
      BUG/MEDIUM: ssl: Fix crash when calling "update ssl ocsp-response" when 
an update is ongoing

Thayne McCombs (1):
      DOC: configuration: clarify http-request wait-for-body

Tim Duesterhus (1):
      CI: Update to actions/cache@v4

William Lallemand (4):
      DOC: configuration: typo req.ssl_hello_type
      BUG/MINOR: mworker/cli: fix set severity-output support
      BUG/MINOR: resolvers: default resolvers fails when network not configured
      MINOR: errors: ha_alert() and ha_warning() uses warn_exec_path()

Willy Tarreau (23):
      MINOR: mux-h2: support limiting the total number of H2 streams per 
connection
      BUG/MINOR: mux-h2: also count streams for refused ones
      MINOR: compiler: add a new DO_NOT_FOLD() macro to prevent code folding
      MINOR: debug: make sure calls to ha_crash_now() are never merged
      MINOR: debug: make ABORT_NOW() store the caller's line number when using 
abort
      MINOR: debug: make BUG_ON() catch build errors even without DEBUG_STRICT
      MINOR: mux-h2/traces: also suggest invalid header upon parsing error
      MINOR: mux-h2/traces: explicitly show the error/refused stream states
      MINOR: mux-h2/traces: clarify the "rejected H2 request" event
      BUG/MEDIUM: mux-h2: refine connection vs stream error on headers
      MINOR: mux-h2/traces: add a missing trace on connection WU with negative 
inc
      BUG/MINOR: vars/cli: fix missing LF after "get var" output
      BUG/MEDIUM: cli: fix once for all the problem of missing trailing LFs
      BUG/MINOR: jwt: fix jwt_verify crash on 32-bit archs
      BUG/MEDIUM: pool: fix rare risk of deadlock in pool_flush()
      BUG/MINOR: h1-htx: properly initialize the err_pos field
      BUG/MEDIUM: h1: always reject the NUL character in header values
      BUG/MINOR: diag: always show the version before dumping a diag warning
      BUG/MINOR: diag: run the final diags before quitting when using -c
      MINOR: ext-check: add an option to preserve environment variables
      BUILD: address a few remaining calloc(size, n) cases
      DOC: internal: update missing data types in peers-v2.0.txt
      DEV: makefile: add a new "range" target to iteratively build all commits

---

Reply via email to