summaryrefslogtreecommitdiffhomepage
path: root/src/core/ngx_array.c
diff options
context:
space:
mode:
authorSergey Kandaurov <pluknet@nginx.com>2025-09-10 17:25:36 +0400
committerpluknet <pluknet@nginx.com>2025-09-12 17:57:48 +0400
commiteb5ebbbed74c8ce72465bb079bde0ad29966d170 (patch)
tree652050c7bbf204622b3138805bd9d7ef2f395fd1 /src/core/ngx_array.c
parent446ce033e5b9e192e228638e826f2a39328d879c (diff)
downloadnginx-eb5ebbbed74c8ce72465bb079bde0ad29966d170.tar.gz
nginx-eb5ebbbed74c8ce72465bb079bde0ad29966d170.tar.bz2
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.
Diffstat (limited to 'src/core/ngx_array.c')
0 files changed, 0 insertions, 0 deletions