diff options
-rw-r--r-- | pjsip/src/pjsip-ua/sip_replaces.c | 17 | ||||
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_call.c | 17 |
2 files changed, 25 insertions, 9 deletions
diff --git a/pjsip/src/pjsip-ua/sip_replaces.c b/pjsip/src/pjsip-ua/sip_replaces.c index 3bda5305..38793762 100644 --- a/pjsip/src/pjsip-ua/sip_replaces.c +++ b/pjsip/src/pjsip-ua/sip_replaces.c @@ -305,12 +305,19 @@ PJ_DEF(pj_status_t) pjsip_replaces_verify_request( pjsip_rx_data *rdata, * initiated by this UA, it returns a 481 (Call/Transaction Does Not * Exist) response to the new INVITE. */ - if (inv->state <= PJSIP_INV_STATE_EARLY && inv->role != PJSIP_ROLE_UAC && - pjsip_cfg()->endpt.accept_replace_in_early_state == PJ_FALSE) + if (inv->state <= PJSIP_INV_STATE_EARLY && inv->role != PJSIP_ROLE_UAC) { - code = PJSIP_SC_CALL_TSX_DOES_NOT_EXIST; - warn_text = "Found early INVITE session but not initiated by this UA"; - goto on_return; + /* Really return 481 only if call haven't reached early state or + * accept-replace-in-early-state (ticket #1587) is not allowed. + */ + if (inv->state != PJSIP_INV_STATE_EARLY || + pjsip_cfg()->endpt.accept_replace_in_early_state == PJ_FALSE) + { + code = PJSIP_SC_CALL_TSX_DOES_NOT_EXIST; + warn_text = "Found early INVITE session but not initiated by " + "this UA"; + goto on_return; + } } diff --git a/pjsip/src/pjsua-lib/pjsua_call.c b/pjsip/src/pjsua-lib/pjsua_call.c index a92874bb..c374f0dc 100644 --- a/pjsip/src/pjsua-lib/pjsua_call.c +++ b/pjsip/src/pjsua-lib/pjsua_call.c @@ -825,11 +825,20 @@ static pj_status_t process_incoming_call_replace(pjsua_call *call, pjsua_var.ua_cfg.cb.on_call_replaced(replaced_call->index, call->index); - PJ_LOG(4,(THIS_FILE, "Answering replacement call %d with 200/OK", - call->index)); + if (replaced_call->inv->state <= PJSIP_INV_STATE_EARLY && + replaced_call->inv->role != PJSIP_ROLE_UAC) + { + /* Replaced call is not in confirmed state yet and we are not + * the call initiator, should not answer with 200 response here. + */ + } else { + PJ_LOG(4,(THIS_FILE, "Answering replacement call %d with 200/OK", + call->index)); + + /* Answer the new call with 200 response */ + status = pjsip_inv_answer(call->inv, 200, NULL, NULL, &tdata); + } - /* Answer the new call with 200 response */ - status = pjsip_inv_answer(call->inv, 200, NULL, NULL, &tdata); if (status == PJ_SUCCESS) status = pjsip_inv_send_msg(call->inv, tdata); |