Skip to content

Commit

Permalink
Correctly track the original length when generating a stream frame
Browse files Browse the repository at this point in the history
txp_generate_stream_frames() plans chunks of data to send via the
function txp_plan_stream_chunk(). That function may clamp the amount in
the chunk due to flow control, even though there is more available to send.

We should take this into account when deciding whether or not to try
serializing the next chunk.

Reviewed-by: Hugo Landau <hlandau@openssl.org>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from #22601)

(cherry picked from commit e718b24)
  • Loading branch information
mattcaswell authored and hlandau committed Nov 6, 2023
1 parent 1ee0a9d commit 61a468b
Showing 1 changed file with 5 additions and 3 deletions.
8 changes: 5 additions & 3 deletions ssl/quic/quic_txp.c
Original file line number Diff line number Diff line change
Expand Up @@ -2073,6 +2073,7 @@ static int txp_generate_crypto_frames(OSSL_QUIC_TX_PACKETISER *txp,

struct chunk_info {
OSSL_QUIC_FRAME_STREAM shdr;
uint64_t orig_len;
OSSL_QTX_IOVEC iov[2];
size_t num_stream_iovec;
int valid;
Expand All @@ -2099,6 +2100,8 @@ static int txp_plan_stream_chunk(OSSL_QUIC_TX_PACKETISER *txp,
/* Should only have 0-length chunk if FIN */
return 0;

chunk->orig_len = chunk->shdr.len;

/* Clamp according to connection and stream-level TXFC. */
fc_credit = ossl_quic_txfc_get_credit(stream_txfc);
fc_swm = ossl_quic_txfc_get_swm(stream_txfc);
Expand Down Expand Up @@ -2199,7 +2202,7 @@ static int txp_generate_stream_frames(OSSL_QUIC_TX_PACKETISER *txp,
goto err;

shdr = &chunks[i % 2].shdr;
orig_len = shdr->len;
orig_len = chunks[i % 2].orig_len;
if (i > 0)
/* Load next chunk for lookahead. */
if (!txp_plan_stream_chunk(txp, h, sstream, stream_txfc, i + 1,
Expand Down Expand Up @@ -2331,8 +2334,7 @@ static int txp_generate_stream_frames(OSSL_QUIC_TX_PACKETISER *txp,
if (shdr->len < orig_len) {
/*
* If we did not serialize all of this chunk we definitely do not
* want to try the next chunk (and we must not mark the stream
* as drained).
* want to try the next chunk
*/
rc = 1;
goto err;
Expand Down

0 comments on commit 61a468b

Please sign in to comment.