mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-12 15:45:18 +00:00
Merge "res_pjsip: Move URI validation to use time."
This commit is contained in:
@@ -1180,6 +1180,11 @@ int ast_sip_push_task(struct ast_taskprocessor *serializer, int (*sip_task)(void
|
|||||||
* cause a deadlock. If you are in a SIP servant thread, just call your function
|
* cause a deadlock. If you are in a SIP servant thread, just call your function
|
||||||
* in-line.
|
* in-line.
|
||||||
*
|
*
|
||||||
|
* \warning \b Never hold locks that may be acquired by a SIP servant thread when
|
||||||
|
* calling this function. Doing so may cause a deadlock if all SIP servant threads
|
||||||
|
* are blocked waiting to acquire the lock while the thread holding the lock is
|
||||||
|
* waiting for a free SIP servant thread.
|
||||||
|
*
|
||||||
* \param serializer The SIP serializer to which the task belongs. May be NULL.
|
* \param serializer The SIP serializer to which the task belongs. May be NULL.
|
||||||
* \param sip_task The task to execute
|
* \param sip_task The task to execute
|
||||||
* \param task_data The parameter to pass to the task when it executes
|
* \param task_data The parameter to pass to the task when it executes
|
||||||
|
@@ -2559,6 +2559,8 @@ pjsip_dialog *ast_sip_create_dialog_uac(const struct ast_sip_endpoint *endpoint,
|
|||||||
|
|
||||||
pj_strdup2_with_null(dlg->pool, &tmp, outbound_proxy);
|
pj_strdup2_with_null(dlg->pool, &tmp, outbound_proxy);
|
||||||
if (!(route = pjsip_parse_hdr(dlg->pool, &ROUTE_HNAME, tmp.ptr, tmp.slen, NULL))) {
|
if (!(route = pjsip_parse_hdr(dlg->pool, &ROUTE_HNAME, tmp.ptr, tmp.slen, NULL))) {
|
||||||
|
ast_log(LOG_ERROR, "Could not create dialog to endpoint '%s' as outbound proxy URI '%s' is not valid\n",
|
||||||
|
ast_sorcery_object_get_id(endpoint), outbound_proxy);
|
||||||
dlg->sess_count--;
|
dlg->sess_count--;
|
||||||
pjsip_dlg_terminate(dlg);
|
pjsip_dlg_terminate(dlg);
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -2752,6 +2754,7 @@ static int create_out_of_dialog_request(const pjsip_method *method, struct ast_s
|
|||||||
pj_str_t from;
|
pj_str_t from;
|
||||||
pj_pool_t *pool;
|
pj_pool_t *pool;
|
||||||
pjsip_tpselector selector = { .type = PJSIP_TPSELECTOR_NONE, };
|
pjsip_tpselector selector = { .type = PJSIP_TPSELECTOR_NONE, };
|
||||||
|
pjsip_uri *sip_uri;
|
||||||
|
|
||||||
if (ast_strlen_zero(uri)) {
|
if (ast_strlen_zero(uri)) {
|
||||||
if (!endpoint && (!contact || ast_strlen_zero(contact->uri))) {
|
if (!endpoint && (!contact || ast_strlen_zero(contact->uri))) {
|
||||||
@@ -2788,6 +2791,16 @@ static int create_out_of_dialog_request(const pjsip_method *method, struct ast_s
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sip_uri = pjsip_parse_uri(pool, remote_uri.ptr, remote_uri.slen, 0);
|
||||||
|
if (!sip_uri || (!PJSIP_URI_SCHEME_IS_SIP(sip_uri) && !PJSIP_URI_SCHEME_IS_SIPS(sip_uri))) {
|
||||||
|
ast_log(LOG_ERROR, "Unable to create outbound %.*s request to endpoint %s as URI '%s' is not valid\n",
|
||||||
|
(int) pj_strlen(&method->name), pj_strbuf(&method->name),
|
||||||
|
endpoint ? ast_sorcery_object_get_id(endpoint) : "<none>",
|
||||||
|
pj_strbuf(&remote_uri));
|
||||||
|
pjsip_endpt_release_pool(ast_sip_get_pjsip_endpoint(), pool);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
if (sip_dialog_create_from(pool, &from, endpoint ? endpoint->fromuser : NULL,
|
if (sip_dialog_create_from(pool, &from, endpoint ? endpoint->fromuser : NULL,
|
||||||
endpoint ? endpoint->fromdomain : NULL, &remote_uri, &selector)) {
|
endpoint ? endpoint->fromdomain : NULL, &remote_uri, &selector)) {
|
||||||
ast_log(LOG_ERROR, "Unable to create From header for %.*s request to endpoint %s\n",
|
ast_log(LOG_ERROR, "Unable to create From header for %.*s request to endpoint %s\n",
|
||||||
@@ -2812,8 +2825,9 @@ static int create_out_of_dialog_request(const pjsip_method *method, struct ast_s
|
|||||||
/* If an outbound proxy is specified on the endpoint apply it to this request */
|
/* If an outbound proxy is specified on the endpoint apply it to this request */
|
||||||
if (endpoint && !ast_strlen_zero(endpoint->outbound_proxy) &&
|
if (endpoint && !ast_strlen_zero(endpoint->outbound_proxy) &&
|
||||||
ast_sip_set_outbound_proxy((*tdata), endpoint->outbound_proxy)) {
|
ast_sip_set_outbound_proxy((*tdata), endpoint->outbound_proxy)) {
|
||||||
ast_log(LOG_ERROR, "Unable to apply outbound proxy on request %.*s to endpoint %s\n",
|
ast_log(LOG_ERROR, "Unable to apply outbound proxy on request %.*s to endpoint %s as outbound proxy URI '%s' is not valid\n",
|
||||||
(int) pj_strlen(&method->name), pj_strbuf(&method->name), ast_sorcery_object_get_id(endpoint));
|
(int) pj_strlen(&method->name), pj_strbuf(&method->name), ast_sorcery_object_get_id(endpoint),
|
||||||
|
endpoint->outbound_proxy);
|
||||||
pjsip_endpt_release_pool(ast_sip_get_pjsip_endpoint(), pool);
|
pjsip_endpt_release_pool(ast_sip_get_pjsip_endpoint(), pool);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@@ -319,32 +319,6 @@ static int expiration_struct2str(const void *obj, const intptr_t *args, char **b
|
|||||||
return (ast_asprintf(buf, "%ld", contact->expiration_time.tv_sec) < 0) ? -1 : 0;
|
return (ast_asprintf(buf, "%ld", contact->expiration_time.tv_sec) < 0) ? -1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! \brief Helper function which validates a permanent contact */
|
|
||||||
static int permanent_contact_validate(void *data)
|
|
||||||
{
|
|
||||||
const char *value = data;
|
|
||||||
pj_pool_t *pool;
|
|
||||||
pj_str_t contact_uri;
|
|
||||||
static const pj_str_t HCONTACT = { "Contact", 7 };
|
|
||||||
pjsip_contact_hdr *contact_hdr;
|
|
||||||
int rc = 0;
|
|
||||||
|
|
||||||
pool = pjsip_endpt_create_pool(ast_sip_get_pjsip_endpoint(), "Permanent Contact Validation", 256, 256);
|
|
||||||
if (!pool) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
pj_strdup2_with_null(pool, &contact_uri, value);
|
|
||||||
if (!(contact_hdr = pjsip_parse_hdr(pool, &HCONTACT, contact_uri.ptr, contact_uri.slen, NULL))
|
|
||||||
|| !(PJSIP_URI_SCHEME_IS_SIP(contact_hdr->uri)
|
|
||||||
|| PJSIP_URI_SCHEME_IS_SIPS(contact_hdr->uri))) {
|
|
||||||
rc = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
pjsip_endpt_release_pool(ast_sip_get_pjsip_endpoint(), pool);
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int permanent_uri_sort_fn(const void *obj_left, const void *obj_right, int flags)
|
static int permanent_uri_sort_fn(const void *obj_left, const void *obj_right, int flags)
|
||||||
{
|
{
|
||||||
const struct ast_sip_contact *object_left = obj_left;
|
const struct ast_sip_contact *object_left = obj_left;
|
||||||
@@ -393,12 +367,6 @@ static int permanent_uri_handler(const struct aco_option *opt, struct ast_variab
|
|||||||
struct ast_sip_contact_status *status;
|
struct ast_sip_contact_status *status;
|
||||||
char contact_id[strlen(aor_id) + strlen(contact_uri) + 2 + 1];
|
char contact_id[strlen(aor_id) + strlen(contact_uri) + 2 + 1];
|
||||||
|
|
||||||
if (ast_sip_push_task_synchronous(NULL, permanent_contact_validate, contact_uri)) {
|
|
||||||
ast_log(LOG_ERROR, "Permanent URI on aor '%s' with contact '%s' failed to parse\n",
|
|
||||||
ast_sorcery_object_get_id(aor), contact_uri);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!aor->permanent_contacts) {
|
if (!aor->permanent_contacts) {
|
||||||
aor->permanent_contacts = ao2_container_alloc_list(AO2_ALLOC_OPT_LOCK_NOLOCK,
|
aor->permanent_contacts = ao2_container_alloc_list(AO2_ALLOC_OPT_LOCK_NOLOCK,
|
||||||
AO2_CONTAINER_ALLOC_OPT_DUPS_REJECT, permanent_uri_sort_fn, NULL);
|
AO2_CONTAINER_ALLOC_OPT_DUPS_REJECT, permanent_uri_sort_fn, NULL);
|
||||||
|
@@ -1084,29 +1084,6 @@ static struct ast_endpoint *persistent_endpoint_find_or_create(const struct ast_
|
|||||||
return persistent->endpoint;
|
return persistent->endpoint;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! \brief Helper function which validates an outbound proxy */
|
|
||||||
static int outbound_proxy_validate(void *data)
|
|
||||||
{
|
|
||||||
const char *proxy = data;
|
|
||||||
pj_pool_t *pool;
|
|
||||||
pj_str_t tmp;
|
|
||||||
static const pj_str_t ROUTE_HNAME = { "Route", 5 };
|
|
||||||
|
|
||||||
pool = pjsip_endpt_create_pool(ast_sip_get_pjsip_endpoint(), "Outbound Proxy Validation", 256, 256);
|
|
||||||
if (!pool) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
pj_strdup2_with_null(pool, &tmp, proxy);
|
|
||||||
if (!pjsip_parse_hdr(pool, &ROUTE_HNAME, tmp.ptr, tmp.slen, NULL)) {
|
|
||||||
pjsip_endpt_release_pool(ast_sip_get_pjsip_endpoint(), pool);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
pjsip_endpt_release_pool(ast_sip_get_pjsip_endpoint(), pool);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*! \brief Callback function for when an object is finalized */
|
/*! \brief Callback function for when an object is finalized */
|
||||||
static int sip_endpoint_apply_handler(const struct ast_sorcery *sorcery, void *obj)
|
static int sip_endpoint_apply_handler(const struct ast_sorcery *sorcery, void *obj)
|
||||||
{
|
{
|
||||||
@@ -1116,12 +1093,7 @@ static int sip_endpoint_apply_handler(const struct ast_sorcery *sorcery, void *o
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ast_strlen_zero(endpoint->outbound_proxy) &&
|
if (endpoint->extensions.timer.min_se < 90) {
|
||||||
ast_sip_push_task_synchronous(NULL, outbound_proxy_validate, (char*)endpoint->outbound_proxy)) {
|
|
||||||
ast_log(LOG_ERROR, "Invalid outbound proxy '%s' specified on endpoint '%s'\n",
|
|
||||||
endpoint->outbound_proxy, ast_sorcery_object_get_id(endpoint));
|
|
||||||
return -1;
|
|
||||||
} else if (endpoint->extensions.timer.min_se < 90) {
|
|
||||||
ast_log(LOG_ERROR, "Session timer minimum expires time must be 90 or greater on endpoint '%s'\n",
|
ast_log(LOG_ERROR, "Session timer minimum expires time must be 90 or greater on endpoint '%s'\n",
|
||||||
ast_sorcery_object_get_id(endpoint));
|
ast_sorcery_object_get_id(endpoint));
|
||||||
return -1;
|
return -1;
|
||||||
|
Reference in New Issue
Block a user