Ignore:
Timestamp:
Jul 1, 2019 7:12:43 AM (5 years ago)
Author:
ming
Message:

Fixed #2209: Insufficient variable storage to contain Expires header field/ parameter

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/src/pjsip-ua/sip_reg.c

    r5984 r6035  
    4646#define REGC_TSX_TIMEOUT        33000 
    4747 
    48 enum { NOEXP = 0x1FFFFFFF }; 
     48enum { NOEXP = PJSIP_REGC_EXPIRATION_NOT_SPECIFIED }; 
    4949 
    5050static const pj_str_t XUID_PARAM_NAME = { "x-uid", 5 }; 
     
    740740                          pj_status_t status, int st_code,  
    741741                          const pj_str_t *reason, 
    742                           pjsip_rx_data *rdata, pj_int32_t expiration, 
     742                          pjsip_rx_data *rdata, pj_uint32_t expiration, 
    743743                          int contact_cnt, pjsip_contact_hdr *contact[], 
    744744                          pj_bool_t is_unreg) 
     
    751751    cbparam->rdata = rdata; 
    752752    cbparam->contact_cnt = contact_cnt; 
    753     cbparam->expiration = (expiration >= 0? expiration: 
    754                           regc->expires_requested); 
     753    cbparam->expiration = (expiration != PJSIP_REGC_EXPIRATION_NOT_SPECIFIED? 
     754                           expiration: regc->expires_requested); 
    755755    cbparam->is_unreg = is_unreg; 
    756756    if (contact_cnt) { 
     
    762762static void call_callback(pjsip_regc *regc, pj_status_t status, int st_code,  
    763763                          const pj_str_t *reason, 
    764                           pjsip_rx_data *rdata, pj_int32_t expiration, 
     764                          pjsip_rx_data *rdata, pj_uint32_t expiration, 
    765765                          int contact_cnt, pjsip_contact_hdr *contact[], 
    766766                          pj_bool_t is_unreg) 
     
    799799        char errmsg[PJ_ERR_MSG_SIZE]; 
    800800        pj_str_t reason = pj_strerror(status, errmsg, sizeof(errmsg)); 
    801         call_callback(regc, status, 400, &reason, NULL, -1, 0, NULL, 
     801        call_callback(regc, status, 400, &reason, NULL, NOEXP, 0, NULL, 
    802802                      PJ_FALSE); 
    803803    } 
     
    809809} 
    810810 
    811 static void schedule_registration ( pjsip_regc *regc, pj_int32_t expiration ) 
    812 { 
    813     if (regc->auto_reg && expiration > 0) { 
     811static void schedule_registration ( pjsip_regc *regc, pj_uint32_t expiration ) 
     812{ 
     813    if (regc->auto_reg && expiration > 0 && expiration != NOEXP) { 
    814814        pj_time_val delay = { 0, 0}; 
    815815 
     
    893893 
    894894 
    895 static pj_int32_t calculate_response_expiration(const pjsip_regc *regc, 
    896                                                 const pjsip_rx_data *rdata, 
    897                                                 unsigned *contact_cnt, 
    898                                                 unsigned max_contact, 
    899                                                 pjsip_contact_hdr *contacts[]) 
    900 { 
    901     pj_int32_t expiration = NOEXP; 
     895static pj_uint32_t calculate_response_expiration(const pjsip_regc *regc, 
     896                                                 const pjsip_rx_data *rdata, 
     897                                                 unsigned *contact_cnt, 
     898                                                 unsigned max_contact, 
     899                                                 pjsip_contact_hdr *contacts[]) 
     900{ 
     901    pj_uint32_t expiration = NOEXP; 
    902902    const pjsip_msg *msg = rdata->msg_info.msg; 
    903903    const pjsip_hdr *hdr; 
     
    983983                        has_our_contact = PJ_TRUE; 
    984984 
    985                         if (contacts[i]->expires >= 0 &&  
    986                             contacts[i]->expires < expiration)  
     985                        if (contacts[i]->expires != PJSIP_EXPIRES_NOT_SPECIFIED 
     986                            && contacts[i]->expires < expiration)  
    987987                        { 
    988988                            /* Get the lowest expiration time. */ 
     
    10381038 
    10391039            if (*contact_cnt == our_contact_cnt && *contact_cnt && 
    1040                 contacts[0]->expires >= 0)  
     1040                contacts[0]->expires != PJSIP_EXPIRES_NOT_SPECIFIED)  
    10411041            { 
    10421042                expiration = contacts[0]->expires; 
     
    10981098                     (event->body.tsx_state.type==PJSIP_EVENT_RX_MSG) ?  
    10991099                      event->body.tsx_state.src.rdata : NULL, 
    1100                      -1, 0, NULL, PJ_FALSE); 
     1100                     NOEXP, 0, NULL, PJ_FALSE); 
    11011101 
    11021102        /* Call regc tsx callback before handling any response */ 
     
    11181118                    pjsip_contact_hdr *next = h->next; 
    11191119 
    1120                     if (h->expires == -1) { 
     1120                    if (h->expires == PJSIP_EXPIRES_NOT_SPECIFIED) { 
    11211121                        pj_list_erase(h); 
    11221122                    } 
     
    12061206                call_callback(regc, status, tsx->status_code,  
    12071207                              &rdata->msg_info.msg->line.status.reason, 
    1208                               rdata, -1, 0, NULL, is_unreg); 
     1208                              rdata, NOEXP, 0, NULL, is_unreg); 
    12091209                pj_lock_acquire(regc->lock); 
    12101210            } 
     
    12331233        pjsip_min_expires_hdr *me_hdr; 
    12341234        pjsip_tx_data *tdata; 
    1235         pj_int32_t min_exp; 
     1235        pj_uint32_t min_exp; 
    12361236 
    12371237        /* reset current op */ 
     
    12951295                call_callback(regc, status, tsx->status_code, 
    12961296                              &rdata->msg_info.msg->line.status.reason, 
    1297                               rdata, -1, 0, NULL, PJ_FALSE); 
     1297                              rdata, NOEXP, 0, NULL, PJ_FALSE); 
    12981298                pj_lock_acquire(regc->lock); 
    12991299            } 
     
    13071307    if (!handled) { 
    13081308        pjsip_rx_data *rdata; 
    1309         pj_int32_t expiration = NOEXP; 
     1309        pj_uint32_t expiration = NOEXP; 
    13101310        unsigned contact_cnt = 0; 
    13111311        pjsip_contact_hdr *contact[PJSIP_REGC_MAX_CONTACT]; 
     
    13311331 
    13321332        /* Update registration */ 
    1333         if (expiration==NOEXP) expiration=-1; 
     1333        // if (expiration==NOEXP) expiration=-1; 
    13341334        regc->expires = expiration; 
    13351335 
Note: See TracChangeset for help on using the changeset viewer.