Changeset 734


Ignore:
Timestamp:
Sep 22, 2006 4:55:42 PM (15 years ago)
Author:
bennylp
Message:

Fixed few bugs that seem to have been introduced by new dialog
locking algorithm:

  • Fixed crash in PJSUA-API when initiating client subscription
  • Fixed another crash in PJSUA-API when hanging-up call

Also fixed SDP negotiator:

  • add a=inactive when rejecting media line

Also increase maximum log size from 1500 to 2000 since some
SIP packet is quite large. A little bit of Warning:
THIS MAY AFFECT APPLICATION'S STACK USAGE

Location:
pjproject/trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjlib/include/pj/config.h

    r689 r734  
    345345 * flag is set. 
    346346 * 
    347  * Default: 1500 
     347 * Default: 2000 
    348348 */ 
    349349#ifndef PJ_LOG_MAX_SIZE 
    350 #  define PJ_LOG_MAX_SIZE           1500 
     350#  define PJ_LOG_MAX_SIZE           2000 
    351351#endif 
    352352 
  • pjproject/trunk/pjmedia/src/pjmedia/sdp_neg.c

    r582 r734  
    895895             * Reject the offer by setting the port to zero in the answer. 
    896896             */ 
     897            pjmedia_sdp_attr *a; 
     898 
    897899            /* For simplicity in the construction of the answer, we'll 
    898900             * just clone the media from the offer. Anyway receiver will 
     
    903905            am->desc.port = 0; 
    904906 
    905             /* Match direction */ 
    906             update_media_direction(pool, om, am); 
     907            /* Remove direction attribute, and replace with inactive */ 
     908            remove_all_media_directions(am); 
     909 
     910            a = pjmedia_sdp_attr_create(pool, "inactive", NULL); 
     911            pjmedia_sdp_media_add_attr(am, a); 
    907912 
    908913        } else { 
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_call.c

    r733 r734  
    582582static pj_status_t acquire_call(const char *title, 
    583583                                pjsua_call_id call_id, 
    584                                 pjsua_call **p_call) 
     584                                pjsua_call **p_call, 
     585                                pjsip_dialog **p_dlg) 
    585586{ 
    586587    enum { MAX_RETRY=50 }; 
     
    634635     
    635636    *p_call = call; 
     637    *p_dlg = call->inv->dlg; 
    636638 
    637639    return PJ_SUCCESS; 
     
    646648    pjsua_call *call; 
    647649    pjsua_conf_port_id port_id; 
     650    pjsip_dialog *dlg; 
    648651    pj_status_t status; 
    649652 
     
    651654                     PJ_EINVAL); 
    652655 
    653     status = acquire_call("pjsua_call_get_conf_port()", call_id, &call); 
     656    status = acquire_call("pjsua_call_get_conf_port()", call_id, &call, &dlg); 
    654657    if (status != PJ_SUCCESS) 
    655658        return PJSUA_INVALID_ID; 
     
    657660    port_id = call->conf_slot; 
    658661 
    659     pjsip_dlg_dec_lock(call->inv->dlg); 
     662    pjsip_dlg_dec_lock(dlg); 
    660663 
    661664    return port_id; 
     
    671674{ 
    672675    pjsua_call *call; 
     676    pjsip_dialog *dlg; 
    673677    pj_status_t status; 
    674678 
     
    678682    pj_bzero(info, sizeof(*info)); 
    679683 
    680     status = acquire_call("pjsua_call_get_info()", call_id, &call); 
     684    status = acquire_call("pjsua_call_get_info()", call_id, &call, &dlg); 
    681685    if (status != PJ_SUCCESS) { 
    682686        return status; 
     
    777781    } 
    778782 
    779     pjsip_dlg_dec_lock(call->inv->dlg); 
     783    pjsip_dlg_dec_lock(dlg); 
    780784 
    781785    return PJ_SUCCESS; 
     
    817821{ 
    818822    pjsua_call *call; 
     823    pjsip_dialog *dlg; 
    819824    pjsip_tx_data *tdata; 
    820825    pj_status_t status; 
     
    823828                     PJ_EINVAL); 
    824829 
    825     status = acquire_call("pjsua_call_answer()", call_id, &call); 
     830    status = acquire_call("pjsua_call_answer()", call_id, &call, &dlg); 
    826831    if (status != PJ_SUCCESS) 
    827832        return status; 
     
    835840        pjsua_perror(THIS_FILE, "Error creating response",  
    836841                     status); 
    837         pjsip_dlg_dec_lock(call->inv->dlg); 
     842        pjsip_dlg_dec_lock(dlg); 
    838843        return status; 
    839844    } 
     
    848853                     status); 
    849854 
    850     pjsip_dlg_dec_lock(call->inv->dlg); 
     855    pjsip_dlg_dec_lock(dlg); 
    851856 
    852857    return status; 
     
    864869{ 
    865870    pjsua_call *call; 
     871    pjsip_dialog *dlg; 
    866872    pj_status_t status; 
    867873    pjsip_tx_data *tdata; 
     
    876882                     PJ_EINVAL); 
    877883 
    878     status = acquire_call("pjsua_call_hangup()", call_id, &call); 
     884    status = acquire_call("pjsua_call_hangup()", call_id, &call, &dlg); 
    879885    if (status != PJ_SUCCESS) 
    880886        return status; 
     
    894900                     "Failed to create end session message",  
    895901                     status); 
    896         pjsip_dlg_dec_lock(call->inv->dlg); 
     902        pjsip_dlg_dec_lock(dlg); 
    897903        return status; 
    898904    } 
     
    903909     */ 
    904910    if (tdata == NULL) { 
    905         pjsip_dlg_dec_lock(call->inv->dlg); 
     911        pjsip_dlg_dec_lock(dlg); 
    906912        return PJ_SUCCESS; 
    907913    } 
     
    916922                     "Failed to send end session message",  
    917923                     status); 
    918         pjsip_dlg_dec_lock(call->inv->dlg); 
     924        pjsip_dlg_dec_lock(dlg); 
    919925        return status; 
    920926    } 
    921927 
    922     pjsip_dlg_dec_lock(call->inv->dlg); 
     928    pjsip_dlg_dec_lock(dlg); 
    923929 
    924930    return PJ_SUCCESS; 
     
    934940    pjmedia_sdp_session *sdp; 
    935941    pjsua_call *call; 
     942    pjsip_dialog *dlg; 
    936943    pjsip_tx_data *tdata; 
    937944    pj_status_t status; 
     
    940947                     PJ_EINVAL); 
    941948 
    942     status = acquire_call("pjsua_call_set_hold()", call_id, &call); 
     949    status = acquire_call("pjsua_call_set_hold()", call_id, &call, &dlg); 
    943950    if (status != PJ_SUCCESS) 
    944951        return status; 
     
    947954    if (call->inv->state != PJSIP_INV_STATE_CONFIRMED) { 
    948955        PJ_LOG(3,(THIS_FILE, "Can not hold call that is not confirmed")); 
    949         pjsip_dlg_dec_lock(call->inv->dlg); 
     956        pjsip_dlg_dec_lock(dlg); 
    950957        return PJSIP_ESESSIONSTATE; 
    951958    } 
     
    953960    status = create_inactive_sdp(call, &sdp); 
    954961    if (status != PJ_SUCCESS) { 
    955         pjsip_dlg_dec_lock(call->inv->dlg); 
     962        pjsip_dlg_dec_lock(dlg); 
    956963        return status; 
    957964    } 
     
    961968    if (status != PJ_SUCCESS) { 
    962969        pjsua_perror(THIS_FILE, "Unable to create re-INVITE", status); 
    963         pjsip_dlg_dec_lock(call->inv->dlg); 
     970        pjsip_dlg_dec_lock(dlg); 
    964971        return status; 
    965972    } 
     
    972979    if (status != PJ_SUCCESS) { 
    973980        pjsua_perror(THIS_FILE, "Unable to send re-INVITE", status); 
    974         pjsip_dlg_dec_lock(call->inv->dlg); 
     981        pjsip_dlg_dec_lock(dlg); 
    975982        return status; 
    976983    } 
    977984 
    978     pjsip_dlg_dec_lock(call->inv->dlg); 
     985    pjsip_dlg_dec_lock(dlg); 
    979986 
    980987    return PJ_SUCCESS; 
     
    992999    pjsip_tx_data *tdata; 
    9931000    pjsua_call *call; 
     1001    pjsip_dialog *dlg; 
    9941002    pj_status_t status; 
    9951003 
     
    9981006                     PJ_EINVAL); 
    9991007 
    1000     status = acquire_call("pjsua_call_reinvite()", call_id, &call); 
     1008    status = acquire_call("pjsua_call_reinvite()", call_id, &call, &dlg); 
    10011009    if (status != PJ_SUCCESS) 
    10021010        return status; 
     
    10041012    if (call->inv->state != PJSIP_INV_STATE_CONFIRMED) { 
    10051013        PJ_LOG(3,(THIS_FILE, "Can not re-INVITE call that is not confirmed")); 
    1006         pjsip_dlg_dec_lock(call->inv->dlg); 
     1014        pjsip_dlg_dec_lock(dlg); 
    10071015        return PJSIP_ESESSIONSTATE; 
    10081016    } 
     
    10161024        pjsua_perror(THIS_FILE, "Unable to get SDP from media endpoint",  
    10171025                     status); 
    1018         pjsip_dlg_dec_lock(call->inv->dlg); 
     1026        pjsip_dlg_dec_lock(dlg); 
    10191027        return status; 
    10201028    } 
     
    10241032    if (status != PJ_SUCCESS) { 
    10251033        pjsua_perror(THIS_FILE, "Unable to create re-INVITE", status); 
    1026         pjsip_dlg_dec_lock(call->inv->dlg); 
     1034        pjsip_dlg_dec_lock(dlg); 
    10271035        return status; 
    10281036    } 
     
    10351043    if (status != PJ_SUCCESS) { 
    10361044        pjsua_perror(THIS_FILE, "Unable to send re-INVITE", status); 
    1037         pjsip_dlg_dec_lock(call->inv->dlg); 
     1045        pjsip_dlg_dec_lock(dlg); 
    10381046        return status; 
    10391047    } 
    10401048 
    1041     pjsip_dlg_dec_lock(call->inv->dlg); 
     1049    pjsip_dlg_dec_lock(dlg); 
    10421050 
    10431051    return PJ_SUCCESS; 
     
    10551063    pjsip_tx_data *tdata; 
    10561064    pjsua_call *call; 
     1065    pjsip_dialog *dlg; 
    10571066    struct pjsip_evsub_user xfer_cb; 
    10581067    pj_status_t status; 
     
    10621071                     PJ_EINVAL); 
    10631072     
    1064     status = acquire_call("pjsua_call_xfer()", call_id, &call); 
     1073    status = acquire_call("pjsua_call_xfer()", call_id, &call, &dlg); 
    10651074    if (status != PJ_SUCCESS) 
    10661075        return status; 
     
    10741083    if (status != PJ_SUCCESS) { 
    10751084        pjsua_perror(THIS_FILE, "Unable to create xfer", status); 
    1076         pjsip_dlg_dec_lock(call->inv->dlg); 
     1085        pjsip_dlg_dec_lock(dlg); 
    10771086        return status; 
    10781087    } 
     
    10841093    if (status != PJ_SUCCESS) { 
    10851094        pjsua_perror(THIS_FILE, "Unable to create REFER request", status); 
    1086         pjsip_dlg_dec_lock(call->inv->dlg); 
     1095        pjsip_dlg_dec_lock(dlg); 
    10871096        return status; 
    10881097    } 
     
    10951104    if (status != PJ_SUCCESS) { 
    10961105        pjsua_perror(THIS_FILE, "Unable to send REFER request", status); 
    1097         pjsip_dlg_dec_lock(call->inv->dlg); 
     1106        pjsip_dlg_dec_lock(dlg); 
    10981107        return status; 
    10991108    } 
     
    11041113     */ 
    11051114 
    1106     pjsip_dlg_dec_lock(call->inv->dlg); 
     1115    pjsip_dlg_dec_lock(dlg); 
    11071116 
    11081117    return PJ_SUCCESS; 
     
    11181127{ 
    11191128    pjsua_call *call; 
     1129    pjsip_dialog *dlg; 
    11201130    pj_status_t status; 
    11211131 
     
    11231133                     PJ_EINVAL); 
    11241134     
    1125     status = acquire_call("pjsua_call_dial_dtmf()", call_id, &call); 
     1135    status = acquire_call("pjsua_call_dial_dtmf()", call_id, &call, &dlg); 
    11261136    if (status != PJ_SUCCESS) 
    11271137        return status; 
     
    11291139    if (!call->session) { 
    11301140        PJ_LOG(3,(THIS_FILE, "Media is not established yet!")); 
    1131         pjsip_dlg_dec_lock(call->inv->dlg); 
     1141        pjsip_dlg_dec_lock(dlg); 
    11321142        return PJ_EINVALIDOP; 
    11331143    } 
     
    11351145    status = pjmedia_session_dial_dtmf( call->session, 0, digits); 
    11361146 
    1137     pjsip_dlg_dec_lock(call->inv->dlg); 
     1147    pjsip_dlg_dec_lock(dlg); 
    11381148 
    11391149    return status; 
     
    11511161{ 
    11521162    pjsua_call *call; 
     1163    pjsip_dialog *dlg; 
    11531164    const pj_str_t mime_text_plain = pj_str("text/plain"); 
    11541165    pjsip_media_type ctype; 
     
    11611172                     PJ_EINVAL); 
    11621173 
    1163     status = acquire_call("pjsua_call_send_im", call_id, &call); 
     1174    status = acquire_call("pjsua_call_send_im()", call_id, &call, &dlg); 
    11641175    if (status != PJ_SUCCESS) 
    11651176        return status; 
     
    12151226 
    12161227on_return: 
    1217     pjsip_dlg_dec_lock(call->inv->dlg); 
     1228    pjsip_dlg_dec_lock(dlg); 
    12181229    return status; 
    12191230} 
     
    12281239{ 
    12291240    pjsua_call *call; 
     1241    pjsip_dialog *dlg; 
    12301242    pjsip_tx_data *tdata; 
    12311243    pj_status_t status; 
     
    12341246                     PJ_EINVAL); 
    12351247 
    1236     status = acquire_call("pjsua_call_send_typing_ind", call_id, &call); 
     1248    status = acquire_call("pjsua_call_send_typing_ind", call_id, &call, &dlg); 
    12371249    if (status != PJ_SUCCESS) 
    12381250        return status; 
     
    12611273 
    12621274on_return: 
    1263     pjsip_dlg_dec_lock(call->inv->dlg); 
     1275    pjsip_dlg_dec_lock(dlg); 
    12641276    return status; 
    12651277} 
     
    15351547{ 
    15361548    pjsua_call *call; 
     1549    pjsip_dialog *dlg; 
    15371550    pj_time_val duration, res_delay, con_delay; 
    15381551    char tmp[128]; 
     
    15441557                     PJ_EINVAL); 
    15451558 
    1546     status = acquire_call("pjsua_call_dump()", call_id, &call); 
     1559    status = acquire_call("pjsua_call_dump()", call_id, &call, &dlg); 
    15471560    if (status != PJ_SUCCESS) 
    15481561        return status; 
     
    16021615        dump_media_session(indent, p, end-p, call->session); 
    16031616 
    1604     pjsip_dlg_dec_lock(call->inv->dlg); 
     1617    pjsip_dlg_dec_lock(dlg); 
    16051618 
    16061619    return PJ_SUCCESS; 
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_pres.c

    r685 r734  
    979979    } 
    980980 
    981     /* Set route-set */ 
    982     if (!pj_list_empty(&acc->route_set)) { 
    983         pjsip_dlg_set_route_set(dlg, &acc->route_set); 
    984     } 
    985  
    986     /* Set credentials */ 
    987     if (acc->cred_cnt) { 
    988         pjsip_auth_clt_set_credentials( &dlg->auth_sess,  
    989                                         acc->cred_cnt, acc->cred); 
    990     } 
    991  
    992981    status = pjsip_pres_create_uac( dlg, &pres_callback,  
    993982                                    PJSIP_EVSUB_NO_EVENT_ID, &buddy->sub); 
     
    1000989    } 
    1001990 
     991    /* Set route-set */ 
     992    if (!pj_list_empty(&acc->route_set)) { 
     993        pjsip_dlg_set_route_set(dlg, &acc->route_set); 
     994    } 
     995 
     996    /* Set credentials */ 
     997    if (acc->cred_cnt) { 
     998        pjsip_auth_clt_set_credentials( &dlg->auth_sess,  
     999                                        acc->cred_cnt, acc->cred); 
     1000    } 
     1001 
    10021002    pjsip_evsub_set_mod_data(buddy->sub, pjsua_var.mod.id, buddy); 
    10031003 
Note: See TracChangeset for help on using the changeset viewer.