]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
ari: Fix deadlock problem with functions that use autoservice.
authorDavid M. Lee <dlee@digium.com>
Tue, 3 Dec 2013 20:17:48 +0000 (20:17 +0000)
committerDavid M. Lee <dlee@digium.com>
Tue, 3 Dec 2013 20:17:48 +0000 (20:17 +0000)
The code for getting channel variables from ARI assumed that you needed
to lock the channel in order to properly execute functions and read
channel variables. Apparently, this is not the case, since any dialplan
function that puts the channel into autoservice deadlocks when
attempting to remove the channel from autoservice.

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/12@403342 65c4cc65-6c06-0410-ace0-fbb531ad65f3

res/stasis/control.c

index 1c4f9386213ae671964019cfc687f048e8841538..14c9f57f5bb5c49e04ec1b6c6649424a1d1e95f7 100644 (file)
@@ -426,7 +426,13 @@ int stasis_app_control_unmute(struct stasis_app_control *control, unsigned int d
 char *stasis_app_control_get_channel_var(struct stasis_app_control *control, const char *variable)
 {
        RAII_VAR(struct ast_str *, tmp, ast_str_create(32), ast_free);
-       SCOPED_CHANNELLOCK(lockvar, control->channel);
+
+       /* You may be tempted to lock the channel you're about to read from. You
+        * would be wrong. Some dialplan functions put the channel into
+        * autoservice, which deadlocks if the channel is already locked.
+        * ast_str_retrieve_variable() does its own locking, and the dialplan
+        * functions need to as well. We should be fine without the lock.
+        */
 
        if (!tmp) {
                return NULL;