Change approach to SSL_pending API

Reviewed-by: Neil Horman <nhorman@openssl.org>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/24040)
This commit is contained in:
Hugo Landau 2024-03-29 14:51:35 +00:00 committed by Tomas Mraz
parent c79e0e7d4c
commit 5a13d35f24
2 changed files with 15 additions and 7 deletions

View File

@ -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 * Determines the number of bytes available still to be read, and (if
* has yet to be read. * 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; size_t avail;
int fin = 0; 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)) if (!ossl_quic_rstream_available(s->rstream, &avail, &fin))
avail = 0; avail = 0;
if (avail == 0 && fin) if (avail == 0 && include_fin && fin)
avail = 1; avail = 1;
return avail; return avail;
case QUIC_RSTREAM_STATE_RESET_RECVD: case QUIC_RSTREAM_STATE_RESET_RECVD:
return 1; return include_fin;
case QUIC_RSTREAM_STATE_DATA_READ: case QUIC_RSTREAM_STATE_DATA_READ:
case QUIC_RSTREAM_STATE_RESET_READ: case QUIC_RSTREAM_STATE_RESET_READ:

View File

@ -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, quic_post_write(xso, *written > 0, *written == len, flags,
qctx_should_autotick(ctx)); 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; return 1;
} }
@ -2874,11 +2879,13 @@ static size_t ossl_quic_pending_int(const SSL *s, int check_channel)
} }
if (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_has_pending(ctx.qc->ch)
|| ossl_quic_channel_is_term_any(ctx.qc->ch); || ossl_quic_channel_is_term_any(ctx.qc->ch);
else else
avail = ossl_quic_stream_recv_pending(ctx.xso->stream); avail = ossl_quic_stream_recv_pending(ctx.xso->stream,
/*include_fin=*/0);
out: out:
quic_unlock(ctx.qc); quic_unlock(ctx.qc);