Ignore:
Timestamp:
Apr 13, 2012 4:28:26 AM (12 years ago)
Author:
bennylp
Message:

Fixed #1487: Wrong SDP negotiator state if outgoing UPDATE or re-INVITE is challenged with 401 or 407

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/branches/1.x/pjsip/src/pjsip-ua/sip_inv.c

    r3964 r4046  
    156156    pjsip_inv_session   *inv;       /* The invite session                   */ 
    157157    pj_bool_t            sdp_done;  /* SDP negotiation done for this tsx?   */ 
     158    pj_bool_t            retrying;  /* Resend (e.g. due to 401/407)         */ 
    158159    pj_str_t             done_tag;  /* To tag in RX response with answer    */ 
    159160    pj_bool_t            done_early;/* Negotiation was done for early med?  */ 
     
    28092810             
    28102811        } else { 
     2812            struct tsx_inv_data *tsx_inv_data; 
     2813 
     2814            tsx_inv_data = (struct tsx_inv_data*)tsx->mod_data[mod_inv.mod.id]; 
     2815            if (tsx_inv_data) 
     2816                tsx_inv_data->retrying = PJ_TRUE; 
     2817 
    28112818            /* Re-send BYE. */ 
    28122819            status = pjsip_inv_send_msg(inv, tdata); 
     
    29212928 * Handle incoming response to UAC UPDATE request. 
    29222929 */ 
    2923 static void inv_handle_update_response( pjsip_inv_session *inv, 
    2924                                         pjsip_event *e) 
     2930static pj_bool_t inv_handle_update_response( pjsip_inv_session *inv, 
     2931                                             pjsip_event *e) 
    29252932{ 
    29262933    pjsip_transaction *tsx = e->body.tsx_state.tsx; 
    2927     struct tsx_inv_data *tsx_inv_data = NULL; 
     2934    struct tsx_inv_data *tsx_inv_data; 
     2935    pj_bool_t handled = PJ_FALSE; 
    29282936    pj_status_t status = -1; 
     2937 
     2938    tsx_inv_data = (struct tsx_inv_data*)tsx->mod_data[mod_inv.mod.id]; 
     2939    pj_assert(tsx_inv_data); 
    29292940 
    29302941    /* Handle 401/407 challenge. */ 
     
    29332944    { 
    29342945        pjsip_tx_data *tdata; 
    2935          
     2946 
    29362947        status = pjsip_auth_clt_reinit_req( &inv->dlg->auth_sess,  
    29372948                                            e->body.tsx_state.src.rdata, 
     
    29512962             
    29522963        } else { 
     2964            if (tsx_inv_data) 
     2965                tsx_inv_data->retrying = PJ_TRUE; 
     2966 
    29532967            /* Re-send request. */ 
    29542968            status = pjsip_inv_send_msg(inv, tdata); 
    29552969        } 
     2970 
     2971        handled = PJ_TRUE; 
    29562972    } 
    29572973 
     
    29622978        status = handle_timer_response(inv, e->body.tsx_state.src.rdata, 
    29632979                                       PJ_FALSE); 
     2980        handled = PJ_TRUE; 
    29642981    } 
    29652982 
     
    29732990        status = inv_check_sdp_in_incoming_msg(inv, tsx,  
    29742991                                             e->body.tsx_state.src.rdata); 
     2992        handled = PJ_TRUE; 
    29752993    } 
    29762994     
     
    29863004            status = handle_timer_response(inv, e->body.tsx_state.src.rdata, 
    29873005                                           PJ_FALSE); 
    2988         } 
    2989  
    2990         tsx_inv_data = (struct tsx_inv_data*)tsx->mod_data[mod_inv.mod.id]; 
    2991         if (tsx_inv_data == NULL) { 
    2992             tsx_inv_data=PJ_POOL_ZALLOC_T(tsx->pool, struct tsx_inv_data); 
    2993             tsx_inv_data->inv = inv; 
    2994             tsx->mod_data[mod_inv.mod.id] = tsx_inv_data; 
    2995         } 
    2996     } 
    2997  
    2998     /* Cancel the negotiation if we don't get successful negotiation by now */ 
     3006            handled = PJ_TRUE; 
     3007        } 
     3008    } 
     3009 
     3010    /* Cancel the negotiation if we don't get successful negotiation by now, 
     3011     * unless it's authentication challenge and the request is being retried. 
     3012     */ 
    29993013    if (pjmedia_sdp_neg_get_state(inv->neg) == 
    30003014                PJMEDIA_SDP_NEG_STATE_LOCAL_OFFER && 
    3001         tsx_inv_data && tsx_inv_data->sdp_done == PJ_FALSE)  
     3015        tsx_inv_data && tsx_inv_data->sdp_done == PJ_FALSE && 
     3016        !tsx_inv_data->retrying) 
    30023017    { 
    30033018        pjmedia_sdp_neg_cancel_offer(inv->neg); 
     
    30063021        tsx_inv_data->sdp_done = PJ_TRUE; 
    30073022    } 
     3023 
     3024    return handled; 
    30083025} 
    30093026 
     
    32053222              tsx->status_code == PJSIP_SC_PROXY_AUTHENTICATION_REQUIRED))  
    32063223    { 
    3207  
    32083224        pjsip_tx_data *tdata; 
    32093225        pj_status_t status; 
     
    32273243             
    32283244        } else { 
     3245            struct tsx_inv_data *tsx_inv_data; 
     3246 
     3247            tsx_inv_data = (struct tsx_inv_data*)tsx->mod_data[mod_inv.mod.id]; 
     3248            if (tsx_inv_data) 
     3249                tsx_inv_data->retrying = PJ_TRUE; 
     3250 
    32293251            /* Re-send request. */ 
    32303252            status = pjsip_inv_send_msg(inv, tdata); 
     
    39033925         * Handle response to outgoing UPDATE request. 
    39043926         */ 
    3905         if (handle_uac_tsx_response(inv, e) == PJ_FALSE) 
    3906             inv_handle_update_response(inv, e); 
     3927        if (inv_handle_update_response(inv, e) == PJ_FALSE) 
     3928            handle_uac_tsx_response(inv, e); 
    39073929 
    39083930    } else if (tsx->role == PJSIP_ROLE_UAS && 
     
    42604282 
    42614283            pjmedia_sdp_neg_state neg_state; 
     4284            struct tsx_inv_data *tsx_inv_data; 
     4285 
     4286            tsx_inv_data = (struct tsx_inv_data*)tsx->mod_data[mod_inv.mod.id]; 
    42624287 
    42634288            /* Outgoing INVITE transaction has failed, cancel SDP nego */ 
    42644289            neg_state = pjmedia_sdp_neg_get_state(inv->neg); 
    4265             if (neg_state == PJMEDIA_SDP_NEG_STATE_LOCAL_OFFER) { 
     4290            if (neg_state == PJMEDIA_SDP_NEG_STATE_LOCAL_OFFER && 
     4291                tsx_inv_data->retrying == PJ_FALSE) 
     4292            { 
    42664293                pjmedia_sdp_neg_cancel_offer(inv->neg); 
    42674294            } 
     
    42884315         * Handle response to outgoing UPDATE request. 
    42894316         */ 
    4290         if (handle_uac_tsx_response(inv, e) == PJ_FALSE) 
    4291             inv_handle_update_response(inv, e); 
     4317        if (inv_handle_update_response(inv, e) == PJ_FALSE) 
     4318            handle_uac_tsx_response(inv, e); 
    42924319 
    42934320    } else if (tsx->role == PJSIP_ROLE_UAS && 
Note: See TracChangeset for help on using the changeset viewer.