Merged revisions 135055 via svnmerge from
authorMichiel van Baak <michiel@vanbaak.info>
Fri, 1 Aug 2008 11:00:13 +0000 (11:00 +0000)
committerMichiel van Baak <michiel@vanbaak.info>
Fri, 1 Aug 2008 11:00:13 +0000 (11:00 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.4

........
r135055 | mvanbaak | 2008-08-01 12:55:27 +0200 (Fri, 01 Aug 2008) | 8 lines

fix some potential deadlocks in chan_skinny

(closes issue #13215)
Reported by: qwell
Patches:
      2008080100_bug13215.diff.txt uploaded by mvanbaak (license 7)
Tested by: mvanbaak

........

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

channels/chan_skinny.c

index c7d2c9b..db95ce8 100644 (file)
@@ -1839,6 +1839,7 @@ static int transmit_response(struct skinnysession *s, struct skinny_req *req)
 
        if (letohl(req->len > SKINNY_MAX_PACKET) || letohl(req->len < 0)) {
                ast_log(LOG_WARNING, "transmit_response: the length of the request is out of bounds\n");
+               ast_mutex_unlock(&s->lock);
                return -1;
        }
 
@@ -2872,7 +2873,7 @@ static char *handle_skinny_show_lines(struct ast_cli_entry *e, int cmd, struct a
                                l->label);
                }
        }
-       AST_LIST_LOCK(&devices);
+       AST_LIST_UNLOCK(&devices);
        return CLI_SUCCESS;
 }
 
@@ -6274,6 +6275,7 @@ static int reload_config(void)
                if(setsockopt(skinnysock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) == -1) {
                        ast_log(LOG_ERROR, "Set Socket Options failed: errno %d, %s\n", errno, strerror(errno));
                        ast_config_destroy(cfg);
+                       ast_mutex_unlock(&netlock);
                        return 0;
                }
                if (skinnysock < 0) {
@@ -6286,6 +6288,7 @@ static int reload_config(void)
                                close(skinnysock);
                                skinnysock = -1;
                                ast_config_destroy(cfg);
+                               ast_mutex_unlock(&netlock);
                                return 0;
                        }
                        if (listen(skinnysock,DEFAULT_SKINNY_BACKLOG)) {
@@ -6295,6 +6298,7 @@ static int reload_config(void)
                                        close(skinnysock);
                                        skinnysock = -1;
                                        ast_config_destroy(cfg);
+                                       ast_mutex_unlock(&netlock);
                                        return 0;
                        }
                        ast_verb(2, "Skinny listening on %s:%d\n",