Changeset 1411


Ignore:
Timestamp:
Aug 1, 2007 11:38:14 AM (12 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)

Location:
pjproject/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip-apps/src/samples/proxy.h

    r1405 r1411  
    236236static pj_status_t init_proxy(void) 
    237237{ 
    238     pj_in_addr addr; 
     238    pj_in_addr pri_addr; 
     239    pj_in_addr addr_list[16]; 
     240    unsigned addr_cnt = PJ_ARRAY_SIZE(addr_list); 
    239241    unsigned i; 
    240242 
     
    249251     * to be added in Record-Route. 
    250252     */ 
    251     if (pj_gethostip(&addr) == PJ_SUCCESS) { 
     253    if (pj_gethostip(&pri_addr)==PJ_SUCCESS) { 
    252254        pj_strdup2(global.pool, &global.name[global.name_cnt].host, 
    253                    pj_inet_ntoa(addr)); 
     255                   pj_inet_ntoa(pri_addr)); 
    254256        global.name[global.name_cnt].port = global.port; 
    255257        global.name_cnt++; 
    256258    } 
    257259 
     260    /* Get the rest of IP interfaces */ 
     261    if (pj_enum_ip_interface(&addr_cnt, addr_list) == PJ_SUCCESS) { 
     262        for (i=0; i<addr_cnt; ++i) { 
     263 
     264            if (addr_list[i].s_addr == pri_addr.s_addr) 
     265                continue; 
     266 
     267            pj_strdup2(global.pool, &global.name[global.name_cnt].host, 
     268                       pj_inet_ntoa(addr_list[i])); 
     269            global.name[global.name_cnt].port = global.port; 
     270            global.name_cnt++; 
     271        } 
     272    } 
     273 
     274    /* No need to add this, this should have been added above. 
    258275    global.name[global.name_cnt].host = pj_str("127.0.0.1"); 
    259276    global.name[global.name_cnt].port = global.port; 
    260277    global.name_cnt++; 
     278    */ 
    261279 
    262280    global.name[global.name_cnt].host = *pj_gethostname(); 
  • 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.