diff options
| author | tb <> | 2024-09-09 03:55:55 +0000 |
|---|---|---|
| committer | tb <> | 2024-09-09 03:55:55 +0000 |
| commit | ed93e0377bf9cc0a5c4280d9bb7a044146a05a98 (patch) | |
| tree | e06cd6ad803d2054a9ad7291a58c613f30038750 /src | |
| parent | 6a0a2885d3954aea22b4da65c4715f7b744dac46 (diff) | |
| download | openbsd-ed93e0377bf9cc0a5c4280d9bb7a044146a05a98.tar.gz openbsd-ed93e0377bf9cc0a5c4280d9bb7a044146a05a98.tar.bz2 openbsd-ed93e0377bf9cc0a5c4280d9bb7a044146a05a98.zip | |
Fix alert callback in the QUIC layer
Only close_notify and user_cancelled are warning alerts. All others
should be fatal. In order for the lower layers to behave correctly,
the return code for fatal alerts needs to be TLS13_IO_ALERT instead
of TLS13_IO_SUCCESS.
Failure to signal handshake failure in the public API led to a crash
in HAProxy when forcing the tls cipher to TLS_AES_128_CCM_SHA256 as
found by haproxyfred while investigating
https://github.com/haproxy/haproxy/issues/2569
Kenjiro Nakayama found misbehavior of ngtcp2-based servers, wrote a
similar patch and tested this version.
Fixes https://github.com/libressl/portable/issues/1093
ok jsing
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/libssl/tls13_quic.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/src/lib/libssl/tls13_quic.c b/src/lib/libssl/tls13_quic.c index e5c386ea36..656af6fe6b 100644 --- a/src/lib/libssl/tls13_quic.c +++ b/src/lib/libssl/tls13_quic.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: tls13_quic.c,v 1.7 2022/11/26 16:08:56 tb Exp $ */ | 1 | /* $OpenBSD: tls13_quic.c,v 1.8 2024/09/09 03:55:55 tb Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2022 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2022 Joel Sing <jsing@openbsd.org> |
| 4 | * | 4 | * |
| @@ -131,6 +131,8 @@ tls13_quic_alert_send_cb(int alert_desc, void *arg) | |||
| 131 | { | 131 | { |
| 132 | struct tls13_ctx *ctx = arg; | 132 | struct tls13_ctx *ctx = arg; |
| 133 | SSL *ssl = ctx->ssl; | 133 | SSL *ssl = ctx->ssl; |
| 134 | uint8_t alert_level = TLS13_ALERT_LEVEL_FATAL; | ||
| 135 | int ret = TLS13_IO_ALERT; | ||
| 134 | 136 | ||
| 135 | if (!ssl->quic_method->send_alert(ssl, ctx->hs->tls13.quic_write_level, | 137 | if (!ssl->quic_method->send_alert(ssl, ctx->hs->tls13.quic_write_level, |
| 136 | alert_desc)) { | 138 | alert_desc)) { |
| @@ -138,7 +140,15 @@ tls13_quic_alert_send_cb(int alert_desc, void *arg) | |||
| 138 | return TLS13_IO_FAILURE; | 140 | return TLS13_IO_FAILURE; |
| 139 | } | 141 | } |
| 140 | 142 | ||
| 141 | return TLS13_IO_SUCCESS; | 143 | if (alert_desc == TLS13_ALERT_CLOSE_NOTIFY || |
| 144 | alert_desc == TLS13_ALERT_USER_CANCELED) { | ||
| 145 | alert_level = TLS13_ALERT_LEVEL_WARNING; | ||
| 146 | ret = TLS13_IO_SUCCESS; | ||
| 147 | } | ||
| 148 | |||
| 149 | tls13_record_layer_alert_sent(ctx->rl, alert_level, alert_desc); | ||
| 150 | |||
| 151 | return ret; | ||
| 142 | } | 152 | } |
| 143 | 153 | ||
| 144 | static const struct tls13_record_layer_callbacks quic_rl_callbacks = { | 154 | static const struct tls13_record_layer_callbacks quic_rl_callbacks = { |
