res_pjsip: set callerid_tag to empty string
authorAlexei Gradinari <alex2grad@gmail.com>
Fri, 12 Oct 2018 17:14:03 +0000 (13:14 -0400)
committerAlexei Gradinari <alex2grad@gmail.com>
Mon, 15 Oct 2018 19:17:43 +0000 (14:17 -0500)
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

index 1ea6d7b..ee37fc2 100644 (file)
@@ -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;