]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Fix a crash caused by freeing a dialog directly instead of using dialog_unref.
authorJoshua Colp <jcolp@digium.com>
Fri, 6 Nov 2009 16:56:37 +0000 (16:56 +0000)
committerJoshua Colp <jcolp@digium.com>
Fri, 6 Nov 2009 16:56:37 +0000 (16:56 +0000)
(closes issue #16097)
Reported by: steinwej
Patches:
      no_RTP.diff uploaded by steinwej (license 841)

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

channels/chan_sip.c

index 70e2b7d0c7299e8605daf88305e49a67e2fc3b6b..9ac215491ce998c39c91156133fb336a4a9839d6 100644 (file)
@@ -6218,7 +6218,7 @@ static struct sip_pvt *sip_alloc(ast_string_field callid, struct sockaddr_in *si
                return NULL;
 
        if (ast_string_field_init(p, 512)) {
-               ast_free(p);
+               dialog_unref(p);
                return NULL;
        }
 
@@ -6278,27 +6278,12 @@ static struct sip_pvt *sip_alloc(ast_string_field callid, struct sockaddr_in *si
                        p->udptl = ast_udptl_new_with_bindaddr(sched, io, 0, bindaddr.sin_addr);
                        p->t38_maxdatagram = global_t38_maxdatagram;
                }
-               if (!p->rtp|| (ast_test_flag(&p->flags[1], SIP_PAGE2_VIDEOSUPPORT) && !p->vrtp) 
+               if (p->rtp|| (ast_test_flag(&p->flags[1], SIP_PAGE2_VIDEOSUPPORT) && !p->vrtp) 
                                || (ast_test_flag(&p->flags[1], SIP_PAGE2_TEXTSUPPORT) && !p->trtp)) {
                        ast_log(LOG_WARNING, "Unable to create RTP audio %s%ssession: %s\n",
                                ast_test_flag(&p->flags[1], SIP_PAGE2_VIDEOSUPPORT) ? "and video " : "",
                                ast_test_flag(&p->flags[1], SIP_PAGE2_TEXTSUPPORT) ? "and text " : "", strerror(errno));
-                       if (p->rtp) {
-                               ast_rtp_destroy(p->rtp);
-                       }
-                       if (p->vrtp) {
-                               ast_rtp_destroy(p->vrtp);
-                       }
-                       if (p->udptl) {
-                               ast_udptl_destroy(p->udptl);
-                       }
-                       ast_mutex_destroy(&p->pvt_lock);
-                       if (p->chanvars) {
-                               ast_variables_destroy(p->chanvars);
-                               p->chanvars = NULL;
-                       }
-                       ast_string_field_free_memory(p);
-                       ast_free(p);
+                       dialog_unref(p);
                        return NULL;
                }
                ast_rtp_setqos(p->rtp, global_tos_audio, global_cos_audio, "SIP RTP");