From aae5bdc22e308ca49ba2ef3aac35b0e17d9056be Mon Sep 17 00:00:00 2001
From: Alexei Gradinari <alex2grad@gmail.com>
Date: Fri, 12 Oct 2018 13:14:03 -0400
Subject: [PATCH] res_pjsip: set callerid_tag to empty string

This patch sets the callerid_tag to empty string by default.

If the callerid_tag is set to NULL then the tag does not
become part of a connected line update.
For example:
Alice's tag is "Alice".
Bob's tag is empty.
Charlie's tag is "Charlie".
Alice calls Bob and then does attended transfer to Charlie.
When Alice hangs up the CONNECTEDLINE(tag) is "Alice"
on the interception routine on the Charlie's channel, but should be empty.

Ths patch also fix memory leaks if there are more then one options
"callerid", "callerid_tag", "voicemail_extension" and "contact_user"
in the pjsip.conf endpoint definition.

Change-Id: I86ba455c4677ca8d516d9a04ce7fb4d24dd576e4
---
 res/res_pjsip/pjsip_configuration.c | 19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)

diff --git a/res/res_pjsip/pjsip_configuration.c b/res/res_pjsip/pjsip_configuration.c
index 1ea6d7bb33..ee37fc2e9f 100644
--- a/res/res_pjsip/pjsip_configuration.c
+++ b/res/res_pjsip/pjsip_configuration.c
@@ -591,6 +591,13 @@ static int caller_id_handler(const struct aco_option *opt, struct ast_variable *
 	char cid_name[80] = { '\0' };
 	char cid_num[80] = { '\0' };
 
+	ast_free(endpoint->id.self.name.str);
+	endpoint->id.self.name.str = NULL;
+	endpoint->id.self.name.valid = 0;
+	ast_free(endpoint->id.self.number.str);
+	endpoint->id.self.number.str = NULL;
+	endpoint->id.self.number.valid = 0;
+
 	ast_callerid_split(var->value, cid_name, sizeof(cid_name), cid_num, sizeof(cid_num));
 	if (!ast_strlen_zero(cid_name)) {
 		endpoint->id.self.name.str = ast_strdup(cid_name);
@@ -657,7 +664,10 @@ static int caller_id_privacy_to_str(const void *obj, const intptr_t *args, char
 static int caller_id_tag_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
 {
 	struct ast_sip_endpoint *endpoint = obj;
+
+	ast_free(endpoint->id.self.tag);
 	endpoint->id.self.tag = ast_strdup(var->value);
+
 	return endpoint->id.self.tag ? 0 : -1;
 }
 
@@ -1067,6 +1077,7 @@ static int voicemail_extension_handler(const struct aco_option *opt, struct ast_
 {
 	struct ast_sip_endpoint *endpoint = obj;
 
+	ast_free(endpoint->subscription.mwi.voicemail_extension);
 	endpoint->subscription.mwi.voicemail_extension = ast_strdup(var->value);
 
 	return endpoint->subscription.mwi.voicemail_extension ? 0 : -1;
@@ -1086,12 +1097,10 @@ static int contact_user_handler(const struct aco_option *opt,
 {
 	struct ast_sip_endpoint *endpoint = obj;
 
+	ast_free(endpoint->contact_user);
 	endpoint->contact_user = ast_strdup(var->value);
-	if (!endpoint->contact_user) {
-		return -1;
-	}
 
-	return 0;
+	return endpoint->contact_user ? 0 : -1;
 }
 
 static int contact_user_to_str(const void *obj, const intptr_t *args, char **buf)
@@ -2076,7 +2085,9 @@ void *ast_sip_endpoint_alloc(const char *name)
 		ao2_cleanup(endpoint);
 		return NULL;
 	}
+
 	ast_party_id_init(&endpoint->id.self);
+	endpoint->id.self.tag = ast_strdup("");
 
 	if (AST_VECTOR_INIT(&endpoint->ident_method_order, 1)) {
 		return NULL;
-- 
GitLab