diff options
Diffstat (limited to 'net-misc/asterisk/files/asterisk-16.30.1-r1-iax2_jitterbuffer.patch')
-rw-r--r-- | net-misc/asterisk/files/asterisk-16.30.1-r1-iax2_jitterbuffer.patch | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/net-misc/asterisk/files/asterisk-16.30.1-r1-iax2_jitterbuffer.patch b/net-misc/asterisk/files/asterisk-16.30.1-r1-iax2_jitterbuffer.patch new file mode 100644 index 000000000000..67fb68b3cf42 --- /dev/null +++ b/net-misc/asterisk/files/asterisk-16.30.1-r1-iax2_jitterbuffer.patch @@ -0,0 +1,65 @@ +From 73103bdcd5b342ce5dfa32039333ffadad551151 Mon Sep 17 00:00:00 2001 +From: Naveen Albert <asterisk@phreaknet.org> +Date: Wed, 14 Dec 2022 16:00:51 +0000 +Subject: [PATCH] chan_iax2: Fix jitterbuffer regression prior to receiving + audio. + +ASTERISK_29392 (a security fix) introduced a regression by +not processing frames when we don't have an audio format. + +Currently, chan_iax2 only calls jb_get to read frames from +the jitterbuffer when the voiceformat has been set on the pvt. +However, this only happens when we receive a voice frame, which +means that prior to receiving voice frames, other types of frames +get stalled completely in the jitterbuffer. + +To fix this, we now fallback to using the format negotiated during +call setup until we've actually received a voice frame with a format. +This ensures we're always able to read from the jitterbuffer. + +ASTERISK-30354 #close +ASTERISK-30162 #close + +Change-Id: Ie4fd1e8e088a145ad89e0427c2100a530e964fe9 +--- + channels/chan_iax2.c | 17 ++++++++++++++--- + 1 file changed, 14 insertions(+), 3 deletions(-) + +diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c +index ab6bd61638..5b3caf03b5 100644 +--- a/channels/chan_iax2.c ++++ b/channels/chan_iax2.c +@@ -4158,9 +4158,19 @@ static void __get_from_jb(const void *p) + now.tv_usec += 1000; + + ms = ast_tvdiff_ms(now, pvt->rxcore); +- +- voicefmt = ast_format_compatibility_bitfield2format(pvt->voiceformat); +- if (voicefmt && ms >= (next = jb_next(pvt->jb))) { ++ if (ms >= (next = jb_next(pvt->jb))) { ++ voicefmt = ast_format_compatibility_bitfield2format(pvt->voiceformat); ++ if (!voicefmt) { ++ /* pvt->voiceformat won't be set if we haven't received any voice frames yet. ++ * In this case, fall back to using the format negotiated during call setup, ++ * so we don't stall the jitterbuffer completely. */ ++ voicefmt = ast_format_compatibility_bitfield2format(pvt->peerformat); ++ } ++ if (!voicefmt) { ++ /* Really shouldn't happen, but if it does, should be looked into */ ++ ast_log(LOG_WARNING, "No voice format and no peer format available on %s, backlogging frame\n", ast_channel_name(pvt->owner)); ++ goto cleanup; /* Don't crash if there's no voice format */ ++ } + ret = jb_get(pvt->jb, &frame, ms, ast_format_get_default_ms(voicefmt)); + switch(ret) { + case JB_OK: +@@ -4202,6 +4212,7 @@ static void __get_from_jb(const void *p) + break; + } + } ++cleanup: + if (pvt) + update_jbsched(pvt); + ast_mutex_unlock(&iaxsl[callno]); +-- +2.41.0 + |