]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
app_morsecode: Fix deadlock
authorNaveen Albert <asterisk@phreaknet.org>
Mon, 15 Nov 2021 19:02:40 +0000 (19:02 +0000)
committerKevin Harwell <kharwell@digium.com>
Wed, 17 Nov 2021 00:41:48 +0000 (18:41 -0600)
Fixes a deadlock in app_morsecode caused by locking
the channel twice when reading variables from the
channel. The duplicate lock is simply removed.

ASTERISK-29744 #close

Change-Id: I204000701f123361d7f85e0498fedc90243c75e4

apps/app_morsecode.c

index 995eb70a1e376b34b4521353dfa7a5f57f0ce9d3..f9b211920b55f5524574ebe6fc360e1f74a02505 100644 (file)
@@ -197,14 +197,12 @@ static int morsecode_exec(struct ast_channel *chan, const char *data)
        }
 
        /* Use variable MORSETONE, if set (else 800) */
-       ast_channel_lock(chan);
        tonec = pbx_builtin_getvar_helper(chan, "MORSETONE");
        if (ast_strlen_zero(tonec) || (sscanf(tonec, "%30d", &tone) != 1)) {
                tone = 800;
        }
 
        /* Use variable MORSESPACETONE, if set (else 0) */
-
        toneb = pbx_builtin_getvar_helper(chan, "MORSESPACETONE");
        if (ast_strlen_zero(toneb) || (sscanf(toneb, "%30d", &toneoff) != 1)) {
                toneoff = 0;
@@ -216,8 +214,8 @@ static int morsecode_exec(struct ast_channel *chan, const char *data)
                codetype = "INTERNATIONAL";
        }
 
+       ast_channel_unlock(chan);
        if (!strcmp(codetype, "AMERICAN")) {
-               ast_channel_unlock(chan);
                for (digit = data; *digit; digit++) {
                        const char *dahdit;
                        digit2 = *digit;
@@ -252,7 +250,6 @@ static int morsecode_exec(struct ast_channel *chan, const char *data)
                                break;
                }
        } else { /* International */
-               ast_channel_unlock(chan);
                for (digit = data; *digit; digit++) {
                        const char *dahdit;
                        digit2 = *digit;