]> git.feebdaed.xyz Git - 0xmirror/nginx.git/commit
QUIC: fixed ssl_reject_handshake error handling.
authorSergey Kandaurov <pluknet@nginx.com>
Wed, 10 Sep 2025 13:25:36 +0000 (17:25 +0400)
committerpluknet <pluknet@nginx.com>
Fri, 12 Sep 2025 13:57:48 +0000 (17:57 +0400)
commiteb5ebbbed74c8ce72465bb079bde0ad29966d170
tree652050c7bbf204622b3138805bd9d7ef2f395fd1
parent446ce033e5b9e192e228638e826f2a39328d879c
QUIC: fixed ssl_reject_handshake error handling.

This was broken in 7468a10b6 (1.29.0), resulting in a missing diagnostics
and SSL error queue not cleared for SSL handshakes rejected by SNI, seen
as "ignoring stale global SSL error" alerts, for instance, when doing SSL
shutdown of a long standing connection after rejecting another one by SNI.

The fix is to move the qc->error check after c->ssl->handshake_rejected is
handled first, to make the error queue cleared.  Although not practicably
visible as needed, this is accompanied by clearing the error queue under
the qc->error case as well, to be on the safe side.

As an implementation note, due to the way of handling invalid transport
parameters for OpenSSL 3.5 and above, which leaves a passed pointer not
advanced on error, SSL_get_error() may return either SSL_ERROR_WANT_READ
or SSL_ERROR_WANT_WRITE depending on a library.  To cope with that, both
qc->error and c->ssl->handshake_rejected checks were moved out of
"sslerr != SSL_ERROR_WANT_READ".

Also, this reconstructs a missing "SSL_do_handshake() failed" diagnostics
for the qc->error case, replacing using ngx_ssl_connection_error() with
ngx_connection_error().  It is made this way to avoid logging at the crit
log level because qc->error set is expected to have an empty error queue.

Reported and tested by Vladimir Homutov.
src/event/quic/ngx_event_quic_ssl.c