diff options
author | Richard Mudgett <rmudgett@digium.com> | 2016-08-22 12:31:24 -0500 |
---|---|---|
committer | Richard Mudgett <rmudgett@digium.com> | 2016-08-25 17:13:52 -0500 |
commit | 35cf6c7702665af14e00bea0a5439137952b8aec (patch) | |
tree | 8e7fa2a7968a73341aa1b8f73f367ed53995e840 /res | |
parent | 50b2aa506fed1b28cf8b0c9f76080622097383e2 (diff) |
res_fax.c: Fix deadlock in fax_gateway_indicate_t38().
fax_gateway_indicate_t38() calls ast_indicate_data() which cannot be
called with any channel locks already held. A deadlock can happen if the
function is operating on a local channel.
* Made fax_gateway_indicate_t38() unlock the channel before calling
ast_indicate_data() since fax_gateway_indicate_t38() is always called with
the channel locked.
* Made fax_gateway_indicate_t38() return void since nothing cared about
its return value.
ASTERISK-26203
Reported by: Etienne Lessard
ASTERISK-24822
Reported by: David Brillert
ASTERISK-22732
Reported by: Richard Mudgett
Change-Id: I701ff2d26c5fc23e0d5a48a3fd98759a9fd09407
Diffstat (limited to 'res')
-rw-r--r-- | res/res_fax.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/res/res_fax.c b/res/res_fax.c index f743dbbf1..67b3af1fe 100644 --- a/res/res_fax.c +++ b/res/res_fax.c @@ -3001,12 +3001,15 @@ static struct ast_frame *fax_gateway_detect_v21(struct fax_gateway *gateway, str return f; } -static int fax_gateway_indicate_t38(struct ast_channel *chan, struct ast_channel *active, struct ast_control_t38_parameters *control_params) +/*! \pre chan is locked on entry */ +static void fax_gateway_indicate_t38(struct ast_channel *chan, struct ast_channel *active, struct ast_control_t38_parameters *control_params) { if (active == chan) { - return ast_indicate_data(chan, AST_CONTROL_T38_PARAMETERS, control_params, sizeof(*control_params)); + ast_channel_unlock(chan); + ast_indicate_data(chan, AST_CONTROL_T38_PARAMETERS, control_params, sizeof(*control_params)); + ast_channel_lock(chan); } else { - return ast_queue_control_data(chan, AST_CONTROL_T38_PARAMETERS, control_params, sizeof(*control_params)); + ast_queue_control_data(chan, AST_CONTROL_T38_PARAMETERS, control_params, sizeof(*control_params)); } } |