Dialing API: Cancel a running async thread, may not cancel all calls

race condition: ast_dial_join() may not cancel outgoing call, if
function is called just after called party answer and before
application execution (bit is_running_app not yet set).

This fix adds ast_softhangup() calls in addition to existing
pthread_kill() when is_running_app is not set.

ASTERISK-30258

Change-Id: Idbdd5c15122159661aa8e996a42d5800083131e4
This commit is contained in:
Frederic LE FOLL 2022-10-06 18:51:36 +02:00 committed by George Joseph
parent 180ca32565
commit 50a4495799
1 changed files with 9 additions and 0 deletions

View File

@ -1043,8 +1043,17 @@ enum ast_dial_result ast_dial_join(struct ast_dial *dial)
ast_channel_unlock(chan);
}
} else {
struct ast_dial_channel *channel = NULL;
/* Now we signal it with SIGURG so it will break out of it's waitfor */
pthread_kill(thread, SIGURG);
/* pthread_kill may not be enough, if outgoing channel has already got an answer (no more in waitfor) but is not yet running an application. Force soft hangup. */
AST_LIST_TRAVERSE(&dial->channels, channel, list) {
if (channel->owner) {
ast_softhangup(channel->owner, AST_SOFTHANGUP_EXPLICIT);
}
}
}
AST_LIST_UNLOCK(&dial->channels);