diff --git a/src/quic_rx.c b/src/quic_rx.c index 9d4c3f104..3ec92f0ad 100644 --- a/src/quic_rx.c +++ b/src/quic_rx.c @@ -825,7 +825,7 @@ static int qc_parse_pkt_frms(struct quic_conn *qc, struct quic_rx_packet *pkt, struct quic_frame *frm = NULL; const unsigned char *pos, *end; enum quic_rx_ret_frm ret; - int fast_retrans = 0; + int fast_retrans = 0, cf_err = 0; TRACE_ENTER(QUIC_EV_CONN_PRSHPKT, qc); /* Skip the AAD */ @@ -1107,9 +1107,8 @@ static int qc_parse_pkt_frms(struct quic_conn *qc, struct quic_rx_packet *pkt, case QUIC_RX_RET_FRM_AGAIN: TRACE_STATE("AGAIN encountered", QUIC_EV_CONN_PRSHPKT, qc); - /* avoid freeing without eb_delete() */ - frm = NULL; - goto err; + cf_err = 1; + break; case QUIC_RX_RET_FRM_DONE: TRACE_PROTO("frame handled", QUIC_EV_CONN_PRSAFRM, qc, frm); @@ -1127,6 +1126,9 @@ static int qc_parse_pkt_frms(struct quic_conn *qc, struct quic_rx_packet *pkt, qc_frm_free(qc, &frm); } + if (cf_err) + goto err; + /* Error should be returned if some frames cannot be parsed. */ BUG_ON(!eb_is_empty(&cf_frms_tree));