]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
QUIC CONFORMANCE: RFC 9000 s. 3.3: Stream States — Permitted Frame Types — STREAM
authorHugo Landau <hlandau@openssl.org>
Tue, 6 Jun 2023 15:25:10 +0000 (16:25 +0100)
committerPauli <pauli@openssl.org>
Sun, 16 Jul 2023 22:17:57 +0000 (08:17 +1000)
Reviewed-by: Tomas Mraz <tomas@openssl.org>
Reviewed-by: Matt Caswell <matt@openssl.org>
Reviewed-by: Paul Dale <pauli@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/21135)

ssl/quic/quic_txp.c

index 6f868cfadd7289969a397c1d31506515a70c0329..d2c00cf24fb394359b2e00227fc9aa1d30d3f369 100644 (file)
@@ -1832,12 +1832,15 @@ static int txp_generate_stream_related(OSSL_QUIC_TX_PACKETISER *txp,
         if (stream->want_reset_stream) {
             OSSL_QUIC_FRAME_RESET_STREAM f;
 
+            assert(stream->send_state == QUIC_SSTREAM_STATE_RESET_SENT);
+
             wpkt = tx_helper_begin(h);
             if (wpkt == NULL)
                 return 0; /* alloc error */
 
             f.stream_id         = stream->id;
             f.app_error_code    = stream->reset_stream_aec;
+            /* XXX fix this - use how much we've actually sent */
             f.final_size        = ossl_quic_sstream_get_cur_size(stream->sstream);
             if (!ossl_quic_wire_encode_frame_reset_stream(wpkt, &f)) {
                 tx_helper_rollback(h); /* can't fit */
@@ -1879,8 +1882,18 @@ static int txp_generate_stream_related(OSSL_QUIC_TX_PACKETISER *txp,
             stream->txp_sent_fc = 1;
         }
 
-        /* Stream Data Frames (STREAM) */
-        if (ossl_quic_stream_has_send_buffer(stream)) {
+        /*
+         * Stream Data Frames (STREAM)
+         *
+         * RFC 9000 s. 3.3: A sender MUST NOT send a STREAM [...] frame for a
+         * stream in the "Reset Sent" state [or any terminal state]. We don't
+         * send any moore STREAM frames if we are sending, have sent, or are
+         * planning to send, RESET_STREAM. The other terminal state is Data
+         * Recvd, but txp_generate_stream_frames() is guaranteed to generate
+         * nothing in this case.
+         */
+        if (ossl_quic_stream_has_send_buffer(stream)
+            && !ossl_quic_stream_send_is_reset(stream)) {
             int packet_full = 0, stream_drained = 0;
 
             if (!txp_generate_stream_frames(txp, h, pn_space, tpkt,