diff --git a/res/res_pjsip_diversion.c b/res/res_pjsip_diversion.c index 24d178199e..1cc6e0827f 100644 --- a/res/res_pjsip_diversion.c +++ b/res/res_pjsip_diversion.c @@ -120,6 +120,7 @@ static enum AST_REDIRECTING_REASON cause_to_reason(const unsigned long cause) { static int add_supported(pjsip_tx_data *tdata) { pjsip_supported_hdr *hdr; + unsigned int i; hdr = pjsip_msg_find_hdr(tdata->msg, PJSIP_H_SUPPORTED, NULL); if (!hdr) { @@ -132,6 +133,19 @@ static int add_supported(pjsip_tx_data *tdata) pjsip_msg_add_hdr(tdata->msg, (pjsip_hdr *)hdr); } + /* Asterisk can send multiple "181 Call forwarded" in a single session, + * we might have already modified Supported before + */ + for (i = 0; i < hdr->count; ++i) { + if (pj_stricmp(&hdr->values[i], &HISTINFO_SUPPORTED_NAME) == 0) { + return 0; + } + } + + if (hdr->count >= PJSIP_GENERIC_ARRAY_MAX_COUNT) { + return -1; + } + /* add on to the existing Supported header */ pj_strassign(&hdr->values[hdr->count++], &HISTINFO_SUPPORTED_NAME); diff --git a/res/res_pjsip_outbound_registration.c b/res/res_pjsip_outbound_registration.c index 4d0e38e612..aac26993a8 100644 --- a/res/res_pjsip_outbound_registration.c +++ b/res/res_pjsip_outbound_registration.c @@ -613,6 +613,7 @@ static int handle_client_registration(void *data) if (client_state->support_path) { pjsip_supported_hdr *hdr; + int i; hdr = pjsip_msg_find_hdr(tdata->msg, PJSIP_H_SUPPORTED, NULL); if (!hdr) { @@ -626,6 +627,17 @@ static int handle_client_registration(void *data) pjsip_msg_add_hdr(tdata->msg, (pjsip_hdr *)hdr); } + /* Don't add the value if it's already there */ + for (i = 0; i < hdr->count; ++i) { + if (pj_stricmp(&hdr->values[i], &PATH_NAME) == 0) { + return 1; + } + } + + if (hdr->count >= PJSIP_GENERIC_ARRAY_MAX_COUNT) { + return 0; + } + /* add on to the existing Supported header */ pj_strassign(&hdr->values[hdr->count++], &PATH_NAME); } diff --git a/res/res_pjsip_path.c b/res/res_pjsip_path.c index adc5a8cf36..9f48009e54 100644 --- a/res/res_pjsip_path.c +++ b/res/res_pjsip_path.c @@ -123,6 +123,7 @@ static int path_get_string(pj_pool_t *pool, struct ast_sip_contact *contact, pj_ static int add_supported(pjsip_tx_data *tdata) { pjsip_supported_hdr *hdr; + int i; hdr = pjsip_msg_find_hdr(tdata->msg, PJSIP_H_SUPPORTED, NULL); if (!hdr) { @@ -135,6 +136,17 @@ static int add_supported(pjsip_tx_data *tdata) pjsip_msg_add_hdr(tdata->msg, (pjsip_hdr *)hdr); } + /* Don't add the value if it's already there */ + for (i = 0; i < hdr->count; ++i) { + if (pj_stricmp(&hdr->values[i], &PATH_SUPPORTED_NAME) == 0) { + return 0; + } + } + + if (hdr->count >= PJSIP_GENERIC_ARRAY_MAX_COUNT) { + return -1; + } + /* add on to the existing Supported header */ pj_strassign(&hdr->values[hdr->count++], &PATH_SUPPORTED_NAME);