]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Fix an assertion in res_pjsip when specifying an invalid outbound proxy.
authorJoshua Colp <jcolp@digium.com>
Thu, 10 Oct 2013 12:25:44 +0000 (12:25 +0000)
committerJoshua Colp <jcolp@digium.com>
Thu, 10 Oct 2013 12:25:44 +0000 (12:25 +0000)
This change fixes two issues when setting an outbound proxy:

1. The outbound proxy URI was not parsed and validated during configuration.
2. If an outgoing dialog was created and the outbound proxy could not be set an assertion would
occur because the usage count on the dialog was not decremented.

The documentation has also been updated to specify that a full URI must be specified for
the outbound proxy.

(closes issue ASTERISK-22672)
Reported by: Antti Yrjola

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/12@400824 65c4cc65-6c06-0410-ace0-fbb531ad65f3

res/res_pjsip.c
res/res_pjsip/pjsip_configuration.c

index 4d9a19e2b676e879b0829ac1c4d735e8b368c661..9718e6c4321da0c1f0f71a3bade2388e7c884845 100644 (file)
                                        <synopsis>Authentication object used for outbound requests</synopsis>
                                </configOption>
                                <configOption name="outbound_proxy">
-                                       <synopsis>Proxy through which to send requests</synopsis>
+                                       <synopsis>Proxy through which to send requests, a full SIP URI must be provided</synopsis>
                                </configOption>
                                <configOption name="rewrite_contact">
                                        <synopsis>Allow Contact header to be rewritten with the source IP address-port</synopsis>
@@ -1401,6 +1401,7 @@ pjsip_dialog *ast_sip_create_dialog_uac(const struct ast_sip_endpoint *endpoint,
 
                pj_strdup2_with_null(dlg->pool, &tmp, outbound_proxy);
                if (!(route = pjsip_parse_hdr(dlg->pool, &ROUTE_HNAME, tmp.ptr, tmp.slen, NULL))) {
+                       dlg->sess_count--;
                        pjsip_dlg_terminate(dlg);
                        return NULL;
                }
index 151ab101643190cee30d989ac57cdd1027a5cc95..0f98a65ae0664a5de45e0429ed608cd466bb808a 100644 (file)
@@ -595,6 +595,28 @@ static int sip_endpoint_apply_handler(const struct ast_sorcery *sorcery, void *o
                return -1;
        }
 
+       if (!ast_strlen_zero(endpoint->outbound_proxy)) {
+               pj_pool_t *pool = pjsip_endpt_create_pool(ast_sip_get_pjsip_endpoint(), "Outbound Proxy Validation", 256, 256);
+               static const pj_str_t ROUTE_HNAME = { "Route", 5 };
+               pj_str_t tmp;
+
+               if (!pool) {
+                       ast_log(LOG_ERROR, "Could not allocate pool for outbound proxy validation on '%s'\n",
+                               ast_sorcery_object_get_id(endpoint));
+                       return -1;
+               }
+
+               pj_strdup2_with_null(pool, &tmp, endpoint->outbound_proxy);
+               if (!pjsip_parse_hdr(pool, &ROUTE_HNAME, tmp.ptr, tmp.slen, NULL)) {
+                       ast_log(LOG_ERROR, "Invalid outbound proxy '%s' specified on endpoint '%s'\n",
+                               endpoint->outbound_proxy, ast_sorcery_object_get_id(endpoint));
+                       pjsip_endpt_release_pool(ast_sip_get_pjsip_endpoint(), pool);
+                       return -1;
+               }
+
+               pjsip_endpt_release_pool(ast_sip_get_pjsip_endpoint(), pool);
+       }
+
        return 0;
 }