From 8cd3f34758b292e137ce112a09f566821549115d Mon Sep 17 00:00:00 2001 From: Hugo Landau Date: Fri, 29 Mar 2024 14:51:35 +0000 Subject: [PATCH] Change approach to SSL_pending API Reviewed-by: Neil Horman Reviewed-by: Tomas Mraz (Merged from https://github.com/openssl/openssl/pull/24040) (cherry picked from commit 5a13d35f243be66f6ad914aefe99fb708812dff1) --- include/internal/quic_stream_map.h | 11 ++++++----- ssl/quic/quic_impl.c | 11 +++++++++-- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/include/internal/quic_stream_map.h b/include/internal/quic_stream_map.h index 55a395de16..745d9c03d4 100644 --- a/include/internal/quic_stream_map.h +++ b/include/internal/quic_stream_map.h @@ -504,10 +504,11 @@ static ossl_inline ossl_unused int ossl_quic_stream_recv_get_final_size(const QU } /* - * Determines the number of bytes available still to be read, and whether a FIN - * has yet to be read. + * Determines the number of bytes available still to be read, and (if + * include_fin is 1) whether a FIN or reset has yet to be read. */ -static ossl_inline ossl_unused int ossl_quic_stream_recv_pending(const QUIC_STREAM *s) +static ossl_inline ossl_unused int ossl_quic_stream_recv_pending(const QUIC_STREAM *s, + int include_fin) { size_t avail; int fin = 0; @@ -523,13 +524,13 @@ static ossl_inline ossl_unused int ossl_quic_stream_recv_pending(const QUIC_STRE if (!ossl_quic_rstream_available(s->rstream, &avail, &fin)) avail = 0; - if (avail == 0 && fin) + if (avail == 0 && include_fin && fin) avail = 1; return avail; case QUIC_RSTREAM_STATE_RESET_RECVD: - return 1; + return include_fin; case QUIC_RSTREAM_STATE_DATA_READ: case QUIC_RSTREAM_STATE_RESET_READ: diff --git a/ssl/quic/quic_impl.c b/ssl/quic/quic_impl.c index 62ebcd29aa..c77230a19f 100644 --- a/ssl/quic/quic_impl.c +++ b/ssl/quic/quic_impl.c @@ -2472,6 +2472,11 @@ static int quic_write_nonblocking_epw(QCTX *ctx, const void *buf, size_t len, quic_post_write(xso, *written > 0, *written == len, flags, qctx_should_autotick(ctx)); + + if (*written == 0) + /* SSL_write_ex returns 0 if it didn't read anything. */ + return QUIC_RAISE_NORMAL_ERROR(ctx, SSL_ERROR_WANT_READ); + return 1; } @@ -2874,11 +2879,13 @@ static size_t ossl_quic_pending_int(const SSL *s, int check_channel) } if (check_channel) - avail = ossl_quic_stream_recv_pending(ctx.xso->stream) + avail = ossl_quic_stream_recv_pending(ctx.xso->stream, + /*include_fin=*/1) || ossl_quic_channel_has_pending(ctx.qc->ch) || ossl_quic_channel_is_term_any(ctx.qc->ch); else - avail = ossl_quic_stream_recv_pending(ctx.xso->stream); + avail = ossl_quic_stream_recv_pending(ctx.xso->stream, + /*include_fin=*/0); out: quic_unlock(ctx.qc);