Commit f2aa6c7017 for asterisk.org

commit f2aa6c70173b5dc59a340b0c7a04057c65875500
Author: Ivan Poddubnyi <ivan.poddubny@gmail.com>
Date:   Tue Dec 29 19:16:00 2020 +0100

    chan_pjsip: Assign SIPDOMAIN after creating a channel

    session->channel doesn't exist until chan_pjsip creates it, so intead of
    setting a channel variable every new incoming call sets one and the same
    global variable.

    This patch moves the code to chan_pjsip so that SIPDOMAIN is set on
    a newly created channel, it also removes a misleading reference to
    channel->session used to fetch call pickup configuraion.

    ASTERISK-29240

    Change-Id: I90c9bbbed01f5d8863585631a29322ae4e046755

diff --git a/channels/chan_pjsip.c b/channels/chan_pjsip.c
index 46fa32775c..f4409de4a7 100644
--- a/channels/chan_pjsip.c
+++ b/channels/chan_pjsip.c
@@ -2980,6 +2980,18 @@ static void chan_pjsip_session_end(struct ast_sip_session *session)
 	SCOPE_EXIT_RTN();
 }

+static void set_sipdomain_variable(struct ast_sip_session *session)
+{
+	pjsip_sip_uri *sip_ruri = pjsip_uri_get_uri(session->request_uri);
+	size_t size = pj_strlen(&sip_ruri->host) + 1;
+	char *domain = ast_alloca(size);
+
+	ast_copy_pj_str(domain, &sip_ruri->host, size);
+
+	pbx_builtin_setvar_helper(session->channel, "SIPDOMAIN", domain);
+	return;
+}
+
 /*! \brief Function called when a request is received on the session */
 static int chan_pjsip_incoming_request(struct ast_sip_session *session, struct pjsip_rx_data *rdata)
 {
@@ -3031,6 +3043,9 @@ static int chan_pjsip_incoming_request(struct ast_sip_session *session, struct p
 		SCOPE_EXIT_LOG_RTN_VALUE(-1, LOG_ERROR, "%s: Failed to allocate new PJSIP channel on incoming SIP INVITE\n",
 			 ast_sip_session_get_name(session));
 	}
+
+	set_sipdomain_variable(session);
+
 	/* channel gets created on incoming request, but we wait to call start
            so other supplements have a chance to run */
 	SCOPE_EXIT_RTN_VALUE(0, "%s\n", ast_sip_session_get_name(session));
diff --git a/res/res_pjsip_session.c b/res/res_pjsip_session.c
index 82ef2aab56..b09e5136df 100644
--- a/res/res_pjsip_session.c
+++ b/res/res_pjsip_session.c
@@ -3733,7 +3733,7 @@ static enum sip_get_destination_result get_destination(struct ast_sip_session *s
 	 */
 	AST_SIP_USER_OPTIONS_TRUNCATE_CHECK(session->exten);

-	pickup_cfg = ast_get_chan_features_pickup_config(session->channel);
+	pickup_cfg = ast_get_chan_features_pickup_config(NULL); /* session->channel doesn't exist yet, using NULL */
 	if (!pickup_cfg) {
 		ast_log(LOG_ERROR, "%s: Unable to retrieve pickup configuration options. Unable to detect call pickup extension\n",
 			ast_sip_session_get_name(session));
@@ -3745,12 +3745,6 @@ static enum sip_get_destination_result get_destination(struct ast_sip_session *s

 	if (!strcmp(session->exten, pickupexten) ||
 		ast_exists_extension(NULL, session->endpoint->context, session->exten, 1, NULL)) {
-		size_t size = pj_strlen(&sip_ruri->host) + 1;
-		char *domain = ast_alloca(size);
-
-		ast_copy_pj_str(domain, &sip_ruri->host, size);
-		pbx_builtin_setvar_helper(session->channel, "SIPDOMAIN", domain);
-
 		/*
 		 * Save off the INVITE Request-URI in case it is
 		 * needed: CHANNEL(pjsip,request_uri)