Changeset 576


Ignore:
Timestamp:
Jul 2, 2006 2:53:05 PM (18 years ago)
Author:
bennylp
Message:

Final changeset from the PROTOS testing, fixed misc. crashes. See
mailing list archive for the details

Location:
pjproject/trunk/pjsip/src
Files:
4 edited

Legend:

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

    r500 r576  
    233233    method = &rdata->msg_info.msg->line.req.method; 
    234234 
    235     if (method->id == PJSIP_INVITE_METHOD || 
    236         method->id == PJSIP_CANCEL_METHOD || 
    237         method->id == PJSIP_BYE_METHOD) 
     235    if (method->id == PJSIP_INVITE_METHOD) { 
     236        return PJ_TRUE; 
     237    } 
     238 
     239    /* BYE and CANCEL must have existing invite session */ 
     240    if (method->id == PJSIP_BYE_METHOD || 
     241        method->id == PJSIP_CANCEL_METHOD) 
    238242    { 
     243        if (inv == NULL) 
     244            return PJ_FALSE; 
     245 
    239246        return PJ_TRUE; 
    240247    } 
     
    781788 
    782789        *p_tdata = tdata; 
     790 
     791        /* Can not return PJ_SUCCESS when response message is produced. 
     792         * Ref: PROTOS test ~#2490 
     793         */ 
     794        if (status == PJ_SUCCESS) 
     795            status = PJSIP_ERRNO_FROM_SIP_STATUS(code); 
     796 
    783797    } 
    784798 
     
    22052219 
    22062220    } 
    2207  
     2221    else if (tsx->method.id == PJSIP_CANCEL_METHOD && 
     2222             tsx->role == PJSIP_ROLE_UAS && 
     2223             tsx->status_code < 200 && 
     2224             e->body.tsx_state.type == PJSIP_EVENT_RX_MSG)  
     2225    { 
     2226 
     2227        /* 
     2228         * Handle strandled incoming CANCEL. 
     2229         */ 
     2230        pjsip_rx_data *rdata = e->body.tsx_state.src.rdata; 
     2231        pjsip_tx_data *tdata; 
     2232        pj_status_t status; 
     2233 
     2234        status = pjsip_dlg_create_response(dlg, rdata, 200, NULL, &tdata); 
     2235        if (status != PJ_SUCCESS) return; 
     2236 
     2237        status = pjsip_dlg_send_response(dlg, tsx, tdata); 
     2238        if (status != PJ_SUCCESS) return; 
     2239 
     2240    } 
    22082241} 
    22092242 
     
    22432276 
    22442277        inv_respond_incoming_bye( inv, tsx, e->body.tsx_state.src.rdata, e ); 
     2278 
     2279    } 
     2280    else if (tsx->method.id == PJSIP_CANCEL_METHOD && 
     2281             tsx->role == PJSIP_ROLE_UAS && 
     2282             tsx->status_code < 200 && 
     2283             e->body.tsx_state.type == PJSIP_EVENT_RX_MSG)  
     2284    { 
     2285 
     2286        /* 
     2287         * Handle strandled incoming CANCEL. 
     2288         */ 
     2289        pjsip_rx_data *rdata = e->body.tsx_state.src.rdata; 
     2290        pjsip_tx_data *tdata; 
     2291        pj_status_t status; 
     2292 
     2293        status = pjsip_dlg_create_response(dlg, rdata, 200, NULL, &tdata); 
     2294        if (status != PJ_SUCCESS) return; 
     2295 
     2296        status = pjsip_dlg_send_response(dlg, tsx, tdata); 
     2297        if (status != PJ_SUCCESS) return; 
    22452298 
    22462299    } 
     
    23782431    PJ_ASSERT_ON_FAIL(tsx && dlg, return); 
    23792432 
    2380     if (tsx->method.id == PJSIP_BYE_METHOD && 
    2381         tsx->role == PJSIP_ROLE_UAS && 
     2433    if (tsx->role == PJSIP_ROLE_UAS && 
    23822434        tsx->status_code < 200 && 
    23832435        e->body.tsx_state.type == PJSIP_EVENT_RX_MSG)  
    23842436    { 
     2437        pjsip_rx_data *rdata = e->body.tsx_state.src.rdata; 
    23852438 
    23862439        /* 
    2387          * Be nice, handle incoming BYE. 
     2440         * Respond BYE with 200/OK 
    23882441         */ 
    2389  
    2390         inv_respond_incoming_bye( inv, tsx, e->body.tsx_state.src.rdata, e ); 
    2391  
    2392     } 
    2393 } 
    2394  
     2442        if (tsx->method.id == PJSIP_BYE_METHOD) { 
     2443            inv_respond_incoming_bye( inv, tsx, rdata, e ); 
     2444        } else if (tsx->method.id == PJSIP_CANCEL_METHOD) { 
     2445            /* 
     2446             * Respond CANCEL with 200/OK too. 
     2447             */ 
     2448            pjsip_tx_data *tdata; 
     2449            pj_status_t status; 
     2450 
     2451            status = pjsip_dlg_create_response(dlg, rdata, 200, NULL, &tdata); 
     2452            if (status != PJ_SUCCESS) return; 
     2453 
     2454            status = pjsip_dlg_send_response(dlg, tsx, tdata); 
     2455            if (status != PJ_SUCCESS) return; 
     2456 
     2457        } 
     2458    } 
     2459} 
     2460 
  • pjproject/trunk/pjsip/src/pjsip/sip_dialog.c

    r446 r576  
    703703    --dlg->sess_count; 
    704704 
    705     if (dlg->sess_count==0 && dlg->tsx_count==0) 
     705    if (dlg->sess_count==0 && dlg->tsx_count==0) { 
     706        pj_mutex_unlock(dlg->mutex); 
     707        pj_mutex_lock(dlg->mutex); 
    706708        unregister_and_destroy_dialog(dlg); 
    707     else { 
     709    } else { 
    708710        pj_mutex_unlock(dlg->mutex); 
    709711    } 
     
    972974     */ 
    973975    if (msg->line.req.method.id != PJSIP_ACK_METHOD) { 
     976        int tsx_count; 
     977 
    974978        status = pjsip_tsx_create_uac(dlg->ua, tdata, &tsx); 
    975979        if (status != PJ_SUCCESS) 
     
    986990 
    987991        /* Increment transaction counter. */ 
    988         ++dlg->tsx_count; 
     992        tsx_count = ++dlg->tsx_count; 
    989993 
    990994        /* Send the message. */ 
    991995        status = pjsip_tsx_send_msg(tsx, tdata); 
    992996        if (status != PJ_SUCCESS) { 
    993             pjsip_tsx_terminate(tsx, tsx->status_code); 
     997            if (dlg->tsx_count == tsx_count) 
     998                pjsip_tsx_terminate(tsx, tsx->status_code); 
    994999            goto on_error; 
    9951000        } 
     
    12601265    pj_status_t status; 
    12611266    pjsip_transaction *tsx = NULL; 
     1267    pj_bool_t processed = PJ_FALSE; 
    12621268    unsigned i; 
    12631269 
     
    13171323    /* Report the request to dialog usages. */ 
    13181324    for (i=0; i<dlg->usage_cnt; ++i) { 
    1319         pj_bool_t processed; 
    13201325 
    13211326        if (!dlg->usage[i]->on_rx_request) 
     
    13311336    if (tsx) 
    13321337        pjsip_tsx_recv_msg(tsx, rdata); 
     1338 
     1339    /* If no dialog usages has claimed the processing of the transaction, 
     1340     * and if transaction has not sent final response, respond with 
     1341     * 500/Internal Server Error. 
     1342     */ 
     1343    if (!processed && tsx && tsx->status_code < 200) { 
     1344        pjsip_tx_data *tdata; 
     1345        const pj_str_t reason = { "No session found", 16}; 
     1346 
     1347        PJ_LOG(4,(tsx->obj_name, "Incoming request was unhandled by " 
     1348                                 "dialog usages, sending 500 response")); 
     1349 
     1350        status = pjsip_dlg_create_response(dlg, rdata, 500, &reason, &tdata); 
     1351        if (status == PJ_SUCCESS) { 
     1352            status = pjsip_dlg_send_response(dlg, tsx, tdata); 
     1353        } 
     1354    } 
    13331355 
    13341356on_return: 
  • pjproject/trunk/pjsip/src/pjsip/sip_parser.c

    r515 r576  
    479479    rec.hname_len = strlen(name); 
    480480    if (rec.hname_len >= sizeof(rec.hname)) { 
     481        pj_assert(!"Header name is too long!"); 
    481482        return PJ_ENAMETOOLONG; 
    482483    } 
     
    546547 
    547548    if (hname->slen >= PJSIP_MAX_HNAME_LEN) { 
    548         pj_assert(!"Header name is too long!"); 
     549        /* Guaranteed not to be able to find handler. */ 
    549550        return NULL; 
    550551    } 
     
    832833            pjsip_parse_hdr_func * handler; 
    833834            pjsip_hdr *hdr = NULL; 
     835 
     836            /* Init hname just in case parsing fails. 
     837             * Ref: PROTOS #2412 
     838             */ 
     839            hname.slen = 0; 
    834840             
    835841            /* Get hname. */ 
     
    914920            if (parsing_headers) 
    915921                err_info->hname = hname; 
     922            else if (msg && msg->type == PJSIP_REQUEST_MSG) 
     923                err_info->hname = pj_str("Request Line"); 
     924            else if (msg && msg->type == PJSIP_RESPONSE_MSG) 
     925                err_info->hname = pj_str("Status Line"); 
    916926            else 
    917927                err_info->hname.slen = 0; 
     
    11261136                                pj_bool_t parse_params) 
    11271137{ 
     1138    /* Bug: 
     1139     * This function should not call back int_parse_name_addr() because 
     1140     * it is called by that function. This would cause stack overflow 
     1141     * with PROTOS test #1223. 
    11281142    if (*scanner->curptr=='"' || *scanner->curptr=='<') { 
    11291143        return (pjsip_uri*)int_parse_name_addr( scanner, pool ); 
    11301144    } else { 
     1145    */ 
    11311146        pj_str_t scheme; 
    11321147        int colon; 
     
    11481163            UNREACHED({ return NULL; /* Not reached. */ }) 
    11491164        } 
    1150     } 
     1165 
     1166    /* 
     1167    } 
     1168    */ 
    11511169} 
    11521170 
  • pjproject/trunk/pjsip/src/pjsip/sip_transport.c

    r563 r576  
    984984 
    985985            PJ_LOG(1, (THIS_FILE,  
    986                       "Error processing packet from %s:%d %.*s:\n" 
    987                       "%s\n" 
     986                      "Error processing %d bytes packet from %s:%d %.*s:\n" 
     987                      "%.*s\n" 
    988988                      "-- end of packet.", 
     989                      msg_fragment_size, 
    989990                      rdata->pkt_info.src_name,  
    990991                      rdata->pkt_info.src_port, 
    991992                      (int)tmp.slen, tmp.ptr, 
     993                      (int)msg_fragment_size, 
    992994                      rdata->msg_info.msg_buf)); 
    993995 
Note: See TracChangeset for help on using the changeset viewer.