H!,

I'm working on a cross-channel standard log line for processing new calls. I had no issue implementing this for DAHDI/IAX/CHAN_SIP, but I have this so far for pjsip got this far, but this does not seem like the right approach because occasionally reads to the sip dialogue are reading uninitialized data.

Patch based on 16.16.1

diff --git a/channels/chan_pjsip.c b/channels/chan_pjsip.c
index f37ec3d712..cab4026e99 100644
--- a/channels/chan_pjsip.c
+++ b/channels/chan_pjsip.c
@@ -3060,28 +3060,65 @@ static int call_pickup_incoming_request(struct ast_sip_session *session, pjsip_r
 }

 static struct ast_sip_session_supplement call_pickup_supplement = {
        .method = "INVITE",
        .priority = AST_SIP_SUPPLEMENT_PRIORITY_LAST - 1,
        .incoming_request = call_pickup_incoming_request,
 };

static int pbx_start_incoming_request(struct ast_sip_session *session, pjsip_rx_data *rdata)
 {
+        RAII_VAR(struct ast_datastore *, datastore, NULL, ao2_cleanup);
        int res;
+       pjsip_dialog *dlg;
+        struct ast_channel *c = session->channel;
+        struct transport_info_data *transport_data;
+        char src_host_and_ip[PJ_INET6_ADDRSTRLEN+2] = "";
+        char dst_host_and_ip[PJ_INET6_ADDRSTRLEN+2] = "";

        /* Check for a to-tag to determine if this is a reinvite */
        if (rdata->msg_info.to->tag.slen) {
                /* We don't care about reinvites */
                return 0;
        }

+       pjsip_dlg_inc_lock(session->inv_session->dlg);
+
+       dlg = session->inv_session->dlg;
+
+       /* local_addr */
+ datastore = ast_sip_session_get_datastore(session, "transport_info");
+       if (!datastore) {
+ ast_log(AST_LOG_WARNING, "No transport information for channel %s\n", ast_channel_name(c));
+       }
+       else {
+               transport_data = datastore->data;
+
+               if (pj_sockaddr_has_addr(&transport_data->local_addr)) {
+ pj_sockaddr_print(&transport_data->local_addr, dst_host_and_ip, sizeof(dst_host_and_ip), 3);
+               }
+
+               if (pj_sockaddr_has_addr(&transport_data->remote_addr)) {
+ pj_sockaddr_print(&transport_data->remote_addr, src_host_and_ip, sizeof(src_host_and_ip), 3);
+               }
+       }
+
+ ast_verb(2, "<%s> New Call (Type: PJSIP) [%s -> %s] [%s] %s <%s> (Destination: %s@%s,%d)\n",
+               ast_channel_name(session->channel),
+               src_host_and_ip, dst_host_and_ip,
+               pj_strbuf(&dlg->call_id->id),
+ S_COR(ast_channel_caller(c)->id.name.valid, ast_channel_caller(c)->id.name.str, "<unknown>"), + S_COR(ast_channel_caller(c)->id.number.valid, ast_channel_caller(c)->id.number.str, "<unknown>"), + ast_channel_exten(c), ast_channel_context(c), ast_channel_priority(c));
+
+       pjsip_dlg_dec_lock(session->inv_session->dlg);
+
        res = ast_pbx_start(session->channel);

        switch (res) {
        case AST_PBX_FAILED:
                ast_log(LOG_WARNING, "Failed to start PBX ;(\n");
ast_channel_hangupcause_set(session->channel, AST_CAUSE_SWITCH_CONGESTION);
                ast_hangup(session->channel);
                break;
        case AST_PBX_CALL_LIMIT:
ast_log(LOG_WARNING, "Failed to start PBX (call limit reached) \n");


==12719== Conditional jump or move depends on uninitialised value(s)
==12719==    at 0x4838C78: strlen (vg_replace_strmem.c:460)
==12719==    by 0x30EF24: ast_ends_with (strings.h:119)
==12719==    by 0x30EF24: format_log_message_ap (logger.c:1698)
==12719==    by 0x31137B: ast_log_full (logger.c:2072)
==12719==    by 0x311940: __ast_verbose_ap (logger.c:2189)
==12719==    by 0x311940: __ast_verbose (logger.c:2200)
==12719==    by 0x11061090: pbx_start_incoming_request (chan_pjsip.c:3104)
==12719== by 0x1033F26F: handle_incoming_request (res_pjsip_session.c:4388)
==12719==    by 0x1034E25F: new_invite (res_pjsip_session.c:4107)
==12719== by 0x1034E25F: handle_new_invite_request (res_pjsip_session.c:4171)
==12719==    by 0x1034E25F: session_on_rx_request (res_pjsip_session.c:4246)
==12719==    by 0x48CE086: pjsip_endpt_process_rx_data (sip_endpoint.c:930)
==12719==    by 0x102366B3: distribute (pjsip_distributor.c:955)
==12719==    by 0x2B0E93: ast_taskprocessor_execute (taskprocessor.c:1237)
==12719==    by 0x2B816F: execute_tasks (threadpool.c:1354)
==12719==    by 0x2B0E93: ast_taskprocessor_execute (taskprocessor.c:1237)

Line 3104 of chan_pjsip in this case is the final ast_verb(2,... for the new call


diff --git a/channels/chan_pjsip.c b/channels/chan_pjsip.c
index f37ec3d712..cab4026e99 100644
--- a/channels/chan_pjsip.c
+++ b/channels/chan_pjsip.c
@@ -3060,28 +3060,65 @@ static int call_pickup_incoming_request(struct ast_sip_session *session, pjsip_r
 }

 static struct ast_sip_session_supplement call_pickup_supplement = {
    .method = "INVITE",
    .priority = AST_SIP_SUPPLEMENT_PRIORITY_LAST - 1,
    .incoming_request = call_pickup_incoming_request,
 };

 static int pbx_start_incoming_request(struct ast_sip_session *session, pjsip_rx_data *rdata)
 {
+        RAII_VAR(struct ast_datastore *, datastore, NULL, ao2_cleanup);
    int res;
+ pjsip_dialog *dlg;
+        struct ast_channel *c = session->channel;
+        struct transport_info_data *transport_data;
+        char src_host_and_ip[PJ_INET6_ADDRSTRLEN+2] = "";
+        char dst_host_and_ip[PJ_INET6_ADDRSTRLEN+2] = "";

    /* Check for a to-tag to determine if this is a reinvite */
    if (rdata->msg_info.to->tag.slen) {
        /* We don't care about reinvites */
        return 0;
    }

+ pjsip_dlg_inc_lock(session->inv_session->dlg);
+
+ dlg = session->inv_session->dlg;
+
+ /* local_addr */
+ datastore = ast_sip_session_get_datastore(session, "transport_info");
+ if (!datastore) {
+     ast_log(AST_LOG_WARNING, "No transport information for channel %s\n", ast_channel_name(c));
+ }
+ else {
+     transport_data = datastore->data;
+
+     if (pj_sockaddr_has_addr(&transport_data->local_addr)) {
+         pj_sockaddr_print(&transport_data->local_addr, dst_host_and_ip, sizeof(dst_host_and_ip), 3);
+     }
+
+     if (pj_sockaddr_has_addr(&transport_data->remote_addr)) {
+         pj_sockaddr_print(&transport_data->remote_addr, src_host_and_ip, sizeof(src_host_and_ip), 3);
+     }
+ }
+
+ ast_verb(2, "<%s> New Call (Type: PJSIP) [%s -> %s] [%s] %s <%s> (Destination: %s@%s,%d)\n",
+     ast_channel_name(session->channel),
+     src_host_and_ip, dst_host_and_ip,
+     pj_strbuf(&dlg->call_id->id),
+     S_COR(ast_channel_caller(c)->id.name.valid, ast_channel_caller(c)->id.name.str, "<unknown>"),
+     S_COR(ast_channel_caller(c)->id.number.valid, ast_channel_caller(c)->id.number.str, "<unknown>"),
+     ast_channel_exten(c), ast_channel_context(c), ast_channel_priority(c));
+
+ pjsip_dlg_dec_lock(session->inv_session->dlg);
+
    res = ast_pbx_start(session->channel);

    switch (res) {
    case AST_PBX_FAILED:
        ast_log(LOG_WARNING, "Failed to start PBX ;(\n");
        ast_channel_hangupcause_set(session->channel, AST_CAUSE_SWITCH_CONGESTION);
        ast_hangup(session->channel);
        break;
    case AST_PBX_CALL_LIMIT:
        ast_log(LOG_WARNING, "Failed to start PBX (call limit reached) \n");
dev64-buster {/home/markm/asterisk/16.16.1-custom} root# git diff channels/chan_pjsip.c | echo

dev64-buster {/home/markm/asterisk/16.16.1-custom} root# git diff channels/chan_pjsip.c | cat
diff --git a/channels/chan_pjsip.c b/channels/chan_pjsip.c
index f37ec3d712..cab4026e99 100644
--- a/channels/chan_pjsip.c
+++ b/channels/chan_pjsip.c
@@ -3060,28 +3060,65 @@ static int call_pickup_incoming_request(struct ast_sip_session *session, pjsip_r
 }

 static struct ast_sip_session_supplement call_pickup_supplement = {
        .method = "INVITE",
        .priority = AST_SIP_SUPPLEMENT_PRIORITY_LAST - 1,
        .incoming_request = call_pickup_incoming_request,
 };

 static int pbx_start_incoming_request(struct ast_sip_session *session, pjsip_rx_data *rdata)
 {
+        RAII_VAR(struct ast_datastore *, datastore, NULL, ao2_cleanup);
        int res;
+       pjsip_dialog *dlg;
+        struct ast_channel *c = session->channel;
+        struct transport_info_data *transport_data;
+        char src_host_and_ip[PJ_INET6_ADDRSTRLEN+2] = "";
+        char dst_host_and_ip[PJ_INET6_ADDRSTRLEN+2] = "";

        /* Check for a to-tag to determine if this is a reinvite */
        if (rdata->msg_info.to->tag.slen) {
                /* We don't care about reinvites */
                return 0;
        }

+       pjsip_dlg_inc_lock(session->inv_session->dlg);
+
+       dlg = session->inv_session->dlg;
+
+       /* local_addr */
+       datastore = ast_sip_session_get_datastore(session, "transport_info");
+       if (!datastore) {
+               ast_log(AST_LOG_WARNING, "No transport information for channel %s\n", ast_channel_name(c));
+       }
+       else {
+               transport_data = datastore->data;
+
+               if (pj_sockaddr_has_addr(&transport_data->local_addr)) {
+                       pj_sockaddr_print(&transport_data->local_addr, dst_host_and_ip, sizeof(dst_host_and_ip), 3);
+               }
+
+               if (pj_sockaddr_has_addr(&transport_data->remote_addr)) {
+                       pj_sockaddr_print(&transport_data->remote_addr, src_host_and_ip, sizeof(src_host_and_ip), 3);
+               }
+       }
+
+       ast_verb(2, "<%s> New Call (Type: PJSIP) [%s -> %s] [%s] %s <%s> (Destination: %s@%s,%d)\n",
+               ast_channel_name(session->channel),
+               src_host_and_ip, dst_host_and_ip,
+               pj_strbuf(&dlg->call_id->id),
+               S_COR(ast_channel_caller(c)->id.name.valid, ast_channel_caller(c)->id.name.str, "<unknown>"),
+               S_COR(ast_channel_caller(c)->id.number.valid, ast_channel_caller(c)->id.number.str, "<unknown>"),
+               ast_channel_exten(c), ast_channel_context(c), ast_channel_priority(c));
+
+       pjsip_dlg_dec_lock(session->inv_session->dlg);
+
        res = ast_pbx_start(session->channel);

        switch (res) {
        case AST_PBX_FAILED:
                ast_log(LOG_WARNING, "Failed to start PBX ;(\n");
                ast_channel_hangupcause_set(session->channel, AST_CAUSE_SWITCH_CONGESTION);
                ast_hangup(session->channel);
                break;
        case AST_PBX_CALL_LIMIT:
                ast_log(LOG_WARNING, "Failed to start PBX (call limit reached) \n");
dev64-buster {/home/markm/asterisk/16.16.1-custom} root#
-- 
_____________________________________________________________________
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

asterisk-dev mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/asterisk-dev

Reply via email to