From a59c1d2ac41219ce0e4b4c7042479d72843c6fe9 Mon Sep 17 00:00:00 2001
From: Jeremy McNamara <jj@nufone.net>
Date: Tue, 20 Jul 2004 21:04:16 +0000
Subject: [PATCH] first attempt to properly copy and then free call detail
 strings.

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@3485 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 channels/chan_h323.c       | 40 ++++++++++++++++++++++++++++++++------
 channels/h323/ast_h323.cpp | 34 ++++++++++++++------------------
 2 files changed, 49 insertions(+), 25 deletions(-)

diff --git a/channels/chan_h323.c b/channels/chan_h323.c
index db2ec980ff..9c5724e34b 100755
--- a/channels/chan_h323.c
+++ b/channels/chan_h323.c
@@ -1054,12 +1054,12 @@ int setup_incoming_call(call_details_t cd)
 	}
 
 	/* Populate the call details in the private structure */
-	p->cd.call_token = cd.call_token;
-	p->cd.call_source_aliases = cd.call_source_aliases;
-	p->cd.call_dest_alias = cd.call_dest_alias;
-	p->cd.call_source_name = cd.call_source_name;
-	p->cd.call_source_e164 = cd.call_source_e164;
-	p->cd.call_dest_e164 = cd.call_dest_e164;
+	p->cd.call_token = strdup(cd.call_token);
+	p->cd.call_source_aliases = strdup(cd.call_source_aliases);
+	p->cd.call_dest_alias = strdup(cd.call_dest_alias);
+	p->cd.call_source_name = strdup(cd.call_source_name);
+	p->cd.call_source_e164 = strdup(cd.call_source_e164);
+	p->cd.call_dest_e164 = strdup(cd.call_dest_e164);
 
 	if (h323debug) {
 		ast_verbose(VERBOSE_PREFIX_3 "Setting up Call\n");
@@ -1291,6 +1291,32 @@ void chan_ringing(unsigned call_reference)
         return;
 }
 
+
+void cleanup_call_details(call_details_t cd) 
+{
+        if (cd.call_token) {
+                free((const char*)cd.call_token);
+        }
+        if (cd.call_source_aliases) {
+                free((const char*)cd.call_source_aliases);
+        }
+        if (cd.call_dest_alias) {
+                free((const char*)cd.call_dest_alias);
+	}
+        if (cd.call_source_name) { 
+                free((const char*)cd.call_source_name);
+        }
+        if (cd.call_source_e164) {
+                free((const char*)cd.call_source_e164);
+        }
+        if (cd.call_dest_e164) {
+                free((const char*)cd.call_dest_e164);
+        }
+        if (cd.sourceIp) {
+                free((const char*)cd.sourceIp);
+        }
+}
+
 /**
   * Call-back function to cleanup communication
   * Returns nothing,
@@ -1335,6 +1361,8 @@ void cleanup_connection(call_details_t cd)
 		ast_rtp_destroy(rtp);
 	}
 
+	cleanup_call_details(p->cd);
+	
 	p->alreadygone = 1;
 	
 	/* Send hangup */	
diff --git a/channels/h323/ast_h323.cpp b/channels/h323/ast_h323.cpp
index d67e95fd34..0e52068e30 100755
--- a/channels/h323/ast_h323.cpp
+++ b/channels/h323/ast_h323.cpp
@@ -375,11 +375,11 @@ void MyH323EndPoint::OnConnectionCleared(H323Connection & connection, const PStr
 	remoteName = connection.GetRemotePartyName();
 
 	cd.call_reference = connection.GetCallReference();
-	cd.call_token = (const char *)clearedCallToken;
-	cd.call_source_aliases = (const char *)connection.GetRemotePartyName();
+	cd.call_token = strdup((const char *)clearedCallToken);
+	cd.call_source_aliases = strdup((const char *)connection.GetRemotePartyName());
 	
   	connection.GetSignallingChannel()->GetRemoteAddress().GetIpAndPort(Ip, sourcePort);
-	cd.sourceIp = (const char *)Ip.AsString();
+	cd.sourceIp = strdup((const char *)Ip.AsString());
 	
 	/* Convert complex strings */
 	char *s;
@@ -539,7 +539,6 @@ BOOL MyH323Connection::OnReceivedSignalSetup(const H323SignalPDU & setupPDU)
 	PString sourceName;
 	PString sourceAliases;	
 	PString destAliases;
-	PString sourceIp;
 	PIPSocket::Address Ip;
 	WORD sourcePort;
 	char *s, *s1; 
@@ -567,18 +566,15 @@ BOOL MyH323Connection::OnReceivedSignalSetup(const H323SignalPDU & setupPDU)
 
 
 	cd.call_reference = GetCallReference();
-	cd.call_token = (const char *)GetCallToken();
-	cd.call_source_aliases  = (const char *)sourceAliases;
-	cd.call_dest_alias = (const char *)destAliases;
-	cd.call_source_e164 = (const char *)sourceE164;
-	cd.call_dest_e164 = (const char *)destE164;
-	cd.call_source_name = (const char *)sourceName;
+	cd.call_token = strdup((const char *)GetCallToken());
+	cd.call_source_aliases  =  strdup((const char *)sourceAliases);
+	cd.call_dest_alias = strdup((const char *)destAliases);
+	cd.call_source_e164 = strdup((const char *)sourceE164);
+	cd.call_dest_e164 = strdup((const char *)destE164);
+	cd.call_source_name = strdup((const char *)sourceName);
 
 	GetSignallingChannel()->GetRemoteAddress().GetIpAndPort(Ip, sourcePort);
-  	sourceIp = Ip.AsString();
- 	cd.sourceIp = (const char *)sourceIp;
- 	
-
+ 	cd.sourceIp = strdup((const char *)Ip.AsString());
 
 	/* Notify Asterisk of the request */
 	int res = on_incoming_call(cd); 
@@ -622,11 +618,11 @@ BOOL MyH323Connection::OnSendSignalSetup(H323SignalPDU & setupPDU)
          	*s1 = '\0';
 
 	cd.call_reference		= GetCallReference();
-	cd.call_token			= (const char *)GetCallToken();
-	cd.call_source_aliases  = (const char *)sourceAliases;
-	cd.call_dest_alias		= (const char *)destAliases;
-	cd.call_source_e164		= (const char *)sourceE164;
-	cd.call_dest_e164		= (const char *)destE164;
+	cd.call_token			= strdup((const char *)GetCallToken());
+	cd.call_source_aliases  	= strdup((const char *)sourceAliases);
+	cd.call_dest_alias		= strdup((const char *)destAliases);
+	cd.call_source_e164		= strdup((const char *)sourceE164);
+	cd.call_dest_e164		= strdup((const char *)destE164);
 
 	int res = on_outgoing_call(cd);	
 		
-- 
GitLab