@@ -696,11 +696,15 @@ static void qcm_ctrl_send(struct qc_stream_desc *stream, uint64_t data, uint64_t
696696 QMUX_EV_QCS_SEND , qcc -> conn , qcs );
697697 }
698698 /* Release buffer if everything sent and buf is full or stream is waiting for room. */
699- if (!qcs_prep_bytes (qcs ) &&
700- (b_full (& qcs -> tx .stream -> buf -> buf ) || qcs -> flags & QC_SF_BLK_MROOM )) {
701- qc_stream_buf_release (qcs -> tx .stream );
702- qcs -> flags &= ~QC_SF_BLK_MROOM ;
703- qcs_notify_send (qcs );
699+ if (!qcs_prep_bytes (qcs )) {
700+ if (b_full (& qcs -> tx .stream -> buf -> buf ) || qcs -> flags & QC_SF_BLK_MROOM ) {
701+ qc_stream_buf_release (qcs -> tx .stream );
702+ qcs -> flags &= ~QC_SF_BLK_MROOM ;
703+ qcs_notify_send (qcs );
704+ }
705+ else if (qcs -> flags & QC_SF_FIN_STREAM ) {
706+ qc_stream_buf_release (qcs -> tx .stream );
707+ }
704708 }
705709
706710 /* Add measurement for send rate. This is done at the MUX layer
@@ -4471,6 +4475,7 @@ static size_t qcm_strm_snd_buf(struct stconn *sc, struct buffer *buf,
44714475 if (fin ) {
44724476 TRACE_STATE ("reached stream fin" , QMUX_EV_STRM_SEND , qcs -> qcc -> conn , qcs );
44734477 qcs -> flags |= QC_SF_FIN_STREAM ;
4478+ qc_stream_buf_release (qcs -> tx .stream );
44744479 }
44754480
44764481 if (ret || fin ) {
@@ -4589,6 +4594,7 @@ static size_t qcm_strm_done_ff(struct stconn *sc)
45894594 if (sd -> iobuf .flags & IOBUF_FL_EOI ) {
45904595 TRACE_STATE ("reached stream fin" , QMUX_EV_STRM_SEND , qcs -> qcc -> conn , qcs );
45914596 qcs -> flags |= QC_SF_FIN_STREAM ;
4597+ qc_stream_buf_release (qcs -> tx .stream );
45924598 }
45934599
45944600 if (!(qcs -> flags & QC_SF_FIN_STREAM ) && !sd -> iobuf .data ) {
0 commit comments