BUG/MINOR: quix: Memleak for non in flight TX packets

First, these packets must not be inserted in the tree of TX packets.
They are never explicitely acknowledged (for instance an ACK only
packet will never be acknowledged). Furthermore, if taken into an account
these packets may uselessly disturb the congestion control. We do not care
if they are lost or not. Furthermore as the ->in_fligh_len member value is null
they were not released by qc_release_lost_pkts() which rely on these values
to decide to release the allocated memory for such packets.

Must be backported to 2.6.
This commit is contained in:
Frédéric Lécaille 2022-08-22 18:47:51 +02:00
parent 16972e19d4
commit da9c441886

View File

@ -3253,12 +3253,21 @@ int qc_send_ppkts(struct buffer *buf, struct ssl_sock_ctx *ctx)
}
qc->path->in_flight += pkt->in_flight_len;
pkt->pktns->tx.in_flight += pkt->in_flight_len;
if (pkt->in_flight_len)
qc_set_timer(qc);
TRACE_DATA("sent pkt", QUIC_EV_CONN_SPPKTS, qc, pkt);
next_pkt = pkt->next;
quic_tx_packet_refinc(pkt);
eb64_insert(&pkt->pktns->tx.pkts, &pkt->pn_node);
TRACE_DATA("sent pkt", QUIC_EV_CONN_SPPKTS, qc, pkt);
if (pkt->in_flight_len) {
/* Ack-eliciting packets or packets with a PADDING frame */
quic_tx_packet_refinc(pkt);
eb64_insert(&pkt->pktns->tx.pkts, &pkt->pn_node);
qc_set_timer(qc);
}
else {
/* Note that we can safely free this packet: There is no
* ack-eliciting frame attached to it. This may be an ACK
* or CONNECTION_CLOSE only packet for instance.
*/
pool_free(pool_head_quic_tx_packet, pkt);
}
}
}