From fd98f7c893f66ba34924c2eee468e582bba4d090 Mon Sep 17 00:00:00 2001 From: Naveen Albert Date: Mon, 28 Aug 2023 13:51:23 -0400 Subject: [PATCH] app_dial: Fix infinite loop when sending digits. If the called party hangs up while digits are being sent, -1 is returned to indicate so, but app_dial was not checking the return value, resulting in the hangup being lost and looping forever until the caller manually hangs up the channel. We now abort if digit sending fails. ASTERISK-29428 #close Resolves: #281 (cherry picked from commit 1ada3c074769772f27ba0b89974b679b2a5cad0b) --- apps/app_dial.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/apps/app_dial.c b/apps/app_dial.c index 44769de6df..2281b0e2a1 100644 --- a/apps/app_dial.c +++ b/apps/app_dial.c @@ -1329,6 +1329,7 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, } winner = ast_waitfor_n(watchers, pos, to); AST_LIST_TRAVERSE(out_chans, o, node) { + int res = 0; struct ast_frame *f; struct ast_channel *c = o->chan; @@ -1607,7 +1608,7 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, "Sending MF '%s' to %s as result of " "receiving a PROGRESS message.\n", mf_progress, hearpulsing ? "parties" : "called party"); - ast_mf_stream(c, (hearpulsing ? NULL : in), + res |= ast_mf_stream(c, (hearpulsing ? NULL : in), (hearpulsing ? in : NULL), mf_progress, 50, 55, 120, 65, 0); } if (!ast_strlen_zero(sf_progress)) { @@ -1615,7 +1616,7 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, "Sending SF '%s' to %s as result of " "receiving a PROGRESS message.\n", sf_progress, (hearpulsing ? "parties" : "called party")); - ast_sf_stream(c, (hearpulsing ? NULL : in), + res |= ast_sf_stream(c, (hearpulsing ? NULL : in), (hearpulsing ? in : NULL), sf_progress, 0, 0); } if (!ast_strlen_zero(dtmf_progress)) { @@ -1623,7 +1624,11 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, "Sending DTMF '%s' to the called party as result of " "receiving a PROGRESS message.\n", dtmf_progress); - ast_dtmf_stream(c, in, dtmf_progress, 250, 0); + res |= ast_dtmf_stream(c, in, dtmf_progress, 250, 0); + } + if (res) { + ast_log(LOG_WARNING, "Called channel %s hung up post-progress before all digits could be sent\n", ast_channel_name(c)); + goto wait_over; } } ast_channel_publish_dial(in, c, NULL, "PROGRESS"); @@ -1637,7 +1642,7 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, "Sending MF '%s' to %s as result of " "receiving a WINK message.\n", mf_wink, (hearpulsing ? "parties" : "called party")); - ast_mf_stream(c, (hearpulsing ? NULL : in), + res |= ast_mf_stream(c, (hearpulsing ? NULL : in), (hearpulsing ? in : NULL), mf_wink, 50, 55, 120, 65, 0); } if (!ast_strlen_zero(sf_wink)) { @@ -1645,9 +1650,13 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, "Sending SF '%s' to %s as result of " "receiving a WINK message.\n", sf_wink, (hearpulsing ? "parties" : "called party")); - ast_sf_stream(c, (hearpulsing ? NULL : in), + res |= ast_sf_stream(c, (hearpulsing ? NULL : in), (hearpulsing ? in : NULL), sf_wink, 0, 0); } + if (res) { + ast_log(LOG_WARNING, "Called channel %s hung up post-wink before all digits could be sent\n", ast_channel_name(c)); + goto wait_over; + } } ast_indicate(in, AST_CONTROL_WINK); break; @@ -1949,6 +1958,7 @@ skip_frame:; } } +wait_over: if (!*to || ast_check_hangup(in)) { ast_verb(3, "Nobody picked up in %d ms\n", orig); publish_dial_end_event(in, out_chans, NULL, "NOANSWER"); -- 2.47.2