Ignore:
Timestamp:
Aug 1, 2007 11:38:14 AM (17 years ago)
Author:
bennylp
Message:

Fixed ticket #359: Wrong Via branch generation in proxy causing the same branch value to be generated for RFC 2543 clients (thanks Helmut Wolf)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/src/pjsip/sip_util_proxy.c

    r1241 r1411  
    2424#include <pj/ctype.h> 
    2525#include <pj/except.h> 
     26#include <pj/guid.h> 
    2627#include <pj/pool.h> 
    2728#include <pj/string.h> 
     
    4344 * @return          PJ_SUCCESS on success. 
    4445 */ 
     46/* 
    4547PJ_DEF(pj_status_t) pjsip_endpt_clone_msg( pjsip_endpoint *endpt, 
    4648                                           const pjsip_rx_data *rdata, 
     
    6264    return PJ_SUCCESS; 
    6365} 
     66*/ 
    6467 
    6568 
     
    336339    pj_uint8_t digest[16]; 
    337340    pj_str_t branch; 
     341    pj_str_t rfc3261_branch = {PJSIP_RFC3261_BRANCH_ID,  
     342                               PJSIP_RFC3261_BRANCH_LEN}; 
     343 
     344    /* If incoming request does not have RFC 3261 branch value, create 
     345     * a branch value from GUID . 
     346     */ 
     347    if (pj_strncmp(&rdata->msg_info.via->branch_param,  
     348                   &rfc3261_branch, PJSIP_RFC3261_BRANCH_LEN) != 0 )  
     349    { 
     350        pj_str_t tmp; 
     351 
     352        branch.ptr = (char*) 
     353                     pj_pool_alloc(rdata->tp_info.pool, PJSIP_MAX_BRANCH_LEN); 
     354        branch.slen = PJSIP_RFC3261_BRANCH_LEN; 
     355        pj_memcpy(branch.ptr, PJSIP_RFC3261_BRANCH_ID,  
     356                  PJSIP_RFC3261_BRANCH_LEN); 
     357 
     358        tmp.ptr = branch.ptr + PJSIP_RFC3261_BRANCH_LEN + 2; 
     359        *(tmp.ptr-2) = (pj_int8_t)(branch.slen+73);  
     360        *(tmp.ptr-1) = (pj_int8_t)(branch.slen+99); 
     361        pj_generate_unique_string( &tmp ); 
     362 
     363        branch.slen = PJSIP_MAX_BRANCH_LEN; 
     364        return branch; 
     365    } 
    338366 
    339367    /* Create branch ID for new request by calculating MD5 hash 
     
    347375    branch.ptr = (char*) 
    348376                 pj_pool_alloc(rdata->tp_info.pool,  
    349                                32 + PJSIP_RFC3261_BRANCH_LEN); 
     377                               34 + PJSIP_RFC3261_BRANCH_LEN); 
    350378    pj_memcpy(branch.ptr, PJSIP_RFC3261_BRANCH_ID, PJSIP_RFC3261_BRANCH_LEN); 
    351  
    352     digest2str(digest, branch.ptr+PJSIP_RFC3261_BRANCH_LEN); 
    353  
    354     branch.slen = 32 + PJSIP_RFC3261_BRANCH_LEN; 
     379    branch.slen = PJSIP_RFC3261_BRANCH_LEN; 
     380    *(branch.ptr+PJSIP_RFC3261_BRANCH_LEN) = (pj_int8_t)(branch.slen+73); 
     381    *(branch.ptr+PJSIP_RFC3261_BRANCH_LEN+1) = (pj_int8_t)(branch.slen+99); 
     382    digest2str(digest, branch.ptr+PJSIP_RFC3261_BRANCH_LEN+2); 
     383    branch.slen = 34 + PJSIP_RFC3261_BRANCH_LEN; 
    355384 
    356385    return branch; 
Note: See TracChangeset for help on using the changeset viewer.