From: Naveen Albert Date: Fri, 13 May 2022 12:33:21 +0000 (+0000) Subject: sig_analog: Fix broken three-way conferencing. X-Git-Tag: 19.5.0-rc1~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=00b44f1c256d494094d1b219201ad9b51aa16d8d;p=thirdparty%2Fasterisk.git sig_analog: Fix broken three-way conferencing. Three-way calling for analog lines is currently broken. If party A is on a call with party B and initiates a three-way call to party C, the behavior differs depending on whether the call is conferenced prior to party C answering. The post-answer case is correct. However, if A flashes before C answers, then the next flash disconnects B rather than C, which is incorrect. This error occurs because the subs are not swapped in the misbehaving case. This is because the flash handler only swaps the subs if C has answered already, which is wrong. To fix this, we swap the subs regardless of whether C has answered or not when the call is conferenced. This ensures that C is disconnected on the next hook flash, rather than B as can happen currently. ASTERISK-30043 #close Change-Id: I96c5bf6c9b7eb2636136b716c677c82c079b6f06 --- diff --git a/channels/sig_analog.c b/channels/sig_analog.c index ea507fe078..fb93d5f3d9 100644 --- a/channels/sig_analog.c +++ b/channels/sig_analog.c @@ -3386,10 +3386,8 @@ static struct ast_frame *__analog_handle_event(struct analog_pvt *p, struct ast_ /* Put them in the threeway, and flip */ analog_set_inthreeway(p, ANALOG_SUB_THREEWAY, 1); analog_set_inthreeway(p, ANALOG_SUB_REAL, 1); - if (ast_channel_state(ast) == AST_STATE_UP) { - analog_swap_subs(p, ANALOG_SUB_THREEWAY, ANALOG_SUB_REAL); - orig_3way_sub = ANALOG_SUB_REAL; - } + analog_swap_subs(p, ANALOG_SUB_THREEWAY, ANALOG_SUB_REAL); + orig_3way_sub = ANALOG_SUB_REAL; ast_queue_unhold(p->subs[orig_3way_sub].owner); analog_set_new_owner(p, p->subs[ANALOG_SUB_REAL].owner); } else {