From c479ca464b0a7717a5579d0fd9d295502ff146ce Mon Sep 17 00:00:00 2001 From: Benny Prijono Date: Wed, 1 Aug 2007 11:38:14 +0000 Subject: Fixed ticket #359: Wrong Via branch generation in proxy causing the same branch value to be generated for RFC 2543 clients (thanks Helmut Wolf) git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1411 74dad513-b988-da41-8d7b-12977e46ad98 --- pjsip/src/pjsip/sip_util_proxy.c | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) (limited to 'pjsip/src') diff --git a/pjsip/src/pjsip/sip_util_proxy.c b/pjsip/src/pjsip/sip_util_proxy.c index 47b64995..6cf44d44 100644 --- a/pjsip/src/pjsip/sip_util_proxy.c +++ b/pjsip/src/pjsip/sip_util_proxy.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -42,6 +43,7 @@ * * @return PJ_SUCCESS on success. */ +/* PJ_DEF(pj_status_t) pjsip_endpt_clone_msg( pjsip_endpoint *endpt, const pjsip_rx_data *rdata, pjsip_tx_data **p_tdata) @@ -61,6 +63,7 @@ PJ_DEF(pj_status_t) pjsip_endpt_clone_msg( pjsip_endpoint *endpt, return PJ_SUCCESS; } +*/ /* @@ -335,6 +338,31 @@ PJ_DEF(pj_str_t) pjsip_calculate_branch_id( pjsip_rx_data *rdata ) pj_md5_context ctx; pj_uint8_t digest[16]; pj_str_t branch; + pj_str_t rfc3261_branch = {PJSIP_RFC3261_BRANCH_ID, + PJSIP_RFC3261_BRANCH_LEN}; + + /* If incoming request does not have RFC 3261 branch value, create + * a branch value from GUID . + */ + if (pj_strncmp(&rdata->msg_info.via->branch_param, + &rfc3261_branch, PJSIP_RFC3261_BRANCH_LEN) != 0 ) + { + pj_str_t tmp; + + branch.ptr = (char*) + pj_pool_alloc(rdata->tp_info.pool, PJSIP_MAX_BRANCH_LEN); + branch.slen = PJSIP_RFC3261_BRANCH_LEN; + pj_memcpy(branch.ptr, PJSIP_RFC3261_BRANCH_ID, + PJSIP_RFC3261_BRANCH_LEN); + + tmp.ptr = branch.ptr + PJSIP_RFC3261_BRANCH_LEN + 2; + *(tmp.ptr-2) = (pj_int8_t)(branch.slen+73); + *(tmp.ptr-1) = (pj_int8_t)(branch.slen+99); + pj_generate_unique_string( &tmp ); + + branch.slen = PJSIP_MAX_BRANCH_LEN; + return branch; + } /* Create branch ID for new request by calculating MD5 hash * of the branch parameter in top-most Via header. @@ -346,12 +374,13 @@ PJ_DEF(pj_str_t) pjsip_calculate_branch_id( pjsip_rx_data *rdata ) branch.ptr = (char*) pj_pool_alloc(rdata->tp_info.pool, - 32 + PJSIP_RFC3261_BRANCH_LEN); + 34 + PJSIP_RFC3261_BRANCH_LEN); pj_memcpy(branch.ptr, PJSIP_RFC3261_BRANCH_ID, PJSIP_RFC3261_BRANCH_LEN); - - digest2str(digest, branch.ptr+PJSIP_RFC3261_BRANCH_LEN); - - branch.slen = 32 + PJSIP_RFC3261_BRANCH_LEN; + branch.slen = PJSIP_RFC3261_BRANCH_LEN; + *(branch.ptr+PJSIP_RFC3261_BRANCH_LEN) = (pj_int8_t)(branch.slen+73); + *(branch.ptr+PJSIP_RFC3261_BRANCH_LEN+1) = (pj_int8_t)(branch.slen+99); + digest2str(digest, branch.ptr+PJSIP_RFC3261_BRANCH_LEN+2); + branch.slen = 34 + PJSIP_RFC3261_BRANCH_LEN; return branch; } -- cgit v1.2.3