diff --git a/res/res_rtp_asterisk.c b/res/res_rtp_asterisk.c index c870fce13c..44291878ae 100644 --- a/res/res_rtp_asterisk.c +++ b/res/res_rtp_asterisk.c @@ -7520,6 +7520,7 @@ static struct ast_frame *ast_rtp_read(struct ast_rtp_instance *instance, int rtc AST_LIST_HEAD_INIT_NOLOCK(&frames); + /* Only non-bundled instances can change/learn the remote's SSRC implicitly. */ if (!child && !AST_VECTOR_SIZE(&rtp->ssrc_mapping)) { /* Force a marker bit and change SSRC if the SSRC changes */ @@ -7561,7 +7562,7 @@ static struct ast_frame *ast_rtp_read(struct ast_rtp_instance *instance, int rtc if (!rtp->recv_buffer) { /* If there is no receive buffer then we can pass back the frame directly */ - return ast_rtp_interpret(instance, srtp, &addr, read_area, res, prev_seqno); + goto free_list_and_interpret; } else if (rtp->expectedrxseqno == -1 || seqno == rtp->expectedrxseqno) { rtp->expectedrxseqno = seqno + 1; @@ -7569,7 +7570,7 @@ static struct ast_frame *ast_rtp_read(struct ast_rtp_instance *instance, int rtc * return it directly without duplicating it. */ if (!ast_data_buffer_count(rtp->recv_buffer)) { - return ast_rtp_interpret(instance, srtp, &addr, read_area, res, prev_seqno); + goto free_list_and_interpret; } if (!AST_VECTOR_REMOVE_CMP_ORDERED(&rtp->missing_seqno, seqno, find_by_value, @@ -7582,7 +7583,7 @@ static struct ast_frame *ast_rtp_read(struct ast_rtp_instance *instance, int rtc * chance it will be overwritten. */ if (!ast_data_buffer_get(rtp->recv_buffer, seqno + 1)) { - return ast_rtp_interpret(instance, srtp, &addr, read_area, res, prev_seqno); + goto free_list_and_interpret; } /* Otherwise we need to dupe the frame so that the potential processing of frames placed after @@ -7696,7 +7697,12 @@ static struct ast_frame *ast_rtp_read(struct ast_rtp_instance *instance, int rtc AST_VECTOR_RESET(&rtp->missing_seqno, AST_VECTOR_ELEM_CLEANUP_NOOP); return AST_LIST_FIRST(&frames); - } else if (seqno < rtp->expectedrxseqno) { + } + + /* We're finished with the frames list */ + ast_frame_free(AST_LIST_FIRST(&frames), 0); + + if (seqno < rtp->expectedrxseqno) { /* If this is a packet from the past then we have received a duplicate packet, so just drop it */ ast_debug(2, "Received an old packet with sequence number '%d' on RTP instance '%p', dropping it\n", seqno, instance); @@ -7807,11 +7813,14 @@ static struct ast_frame *ast_rtp_read(struct ast_rtp_instance *instance, int rtc ast_rtcp_calculate_sr_rr_statistics(instance, rtcp_report, remote_address, ice, sr); } } - - return &ast_null_frame; } return &ast_null_frame; + +free_list_and_interpret: + ast_frame_free(AST_LIST_FIRST(&frames), 0); + return ast_rtp_interpret(instance, srtp, &addr, read_area, res, prev_seqno); + } /*! \pre instance is locked */