]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
func_lock: Fix requesters counter in error paths.
authorJaco Kroon <jaco@uls.co.za>
Sat, 22 May 2021 12:48:18 +0000 (14:48 +0200)
committerGeorge Joseph <gjoseph@digium.com>
Fri, 11 Jun 2021 18:03:16 +0000 (13:03 -0500)
In two places we bail out with failure after we've already incremented
the requesters counter, if this occured then it would effectively result
in unload to wait indefinitely, thus preventing clean shutdown.

Change-Id: I362a6c0dc424f736d4a9c733d818e72d19675283
Signed-off-by: Jaco Kroon <jaco@uls.co.za>
funcs/func_lock.c

index 072640751ea11d13f031d5e0fb9b680c0d3f8562..ad4d58ef8bc37e5281ec4e79b68d9ff2e6bf406a 100644 (file)
@@ -268,7 +268,13 @@ static int get_lock(struct ast_channel *chan, char *lockname, int trylock)
 
        if (!clframe) {
                if (unloading) {
+                       ast_log(LOG_ERROR,
+                               "Busy unloading.  %sLOCK will fail.\n",
+                               trylock ? "TRY" : "");
                        /* Don't bother */
+                       ast_mutex_lock(&current->mutex);
+                       current->requesters--;
+                       ast_mutex_unlock(&current->mutex);
                        AST_LIST_UNLOCK(list);
                        return -1;
                }
@@ -277,6 +283,9 @@ static int get_lock(struct ast_channel *chan, char *lockname, int trylock)
                        ast_log(LOG_ERROR,
                                "Unable to allocate channel lock frame.  %sLOCK will fail.\n",
                                trylock ? "TRY" : "");
+                       ast_mutex_lock(&current->mutex);
+                       current->requesters--;
+                       ast_mutex_unlock(&current->mutex);
                        AST_LIST_UNLOCK(list);
                        return -1;
                }