Fix some bugs in the SIP tcp helper thread.
authorRussell Bryant <russell@russellbryant.com>
Tue, 4 Mar 2008 20:36:16 +0000 (20:36 +0000)
committerRussell Bryant <russell@russellbryant.com>
Tue, 4 Mar 2008 20:36:16 +0000 (20:36 +0000)
 - fix a spot where a lock wouldn't get unlocked in an error condition
 - call ast_mutex_destroy() on the lock before freeing its memory

(related to issue #11972)

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

channels/chan_sip.c

index f5cbda2..8b017eb 100644 (file)
@@ -2200,8 +2200,10 @@ static void *_sip_tcp_helper_thread(struct sip_pvt *pvt, struct server_instance
                while (req.len < 4 || strncmp((char *)&req.data + req.len - 4, "\r\n\r\n", 4)) {
                        if (req.socket.lock) 
                                ast_mutex_lock(req.socket.lock);
-                       if (!fgets(buf, sizeof(buf), ser->f))
+                       if (!fgets(buf, sizeof(buf), ser->f)) {
+                               ast_mutex_unlock(req.socket.lock);
                                goto cleanup;
+                       }
                        if (req.socket.lock) 
                                ast_mutex_unlock(req.socket.lock);
                        if (me->stop) 
@@ -2237,7 +2239,12 @@ cleanup:
 cleanup2:
        fclose(ser->f);
        ast_free(ser);
-       ast_free(req.socket.lock);
+
+       if (req.socket.lock) {
+               ast_mutex_destroy(req.socket.lock);
+               ast_free(req.socket.lock);
+               req.socket.lock = NULL;
+       }
 
        return NULL;
 }