diff --git a/libs/sofia-sip/.update b/libs/sofia-sip/.update index fc5cc4854e..c2ac3b41e2 100644 --- a/libs/sofia-sip/.update +++ b/libs/sofia-sip/.update @@ -1 +1 @@ -Tue Dec 16 14:24:06 CST 2008 +Tue Dec 16 14:28:36 CST 2008 diff --git a/libs/sofia-sip/libsofia-sip-ua/nua/check_register.c b/libs/sofia-sip/libsofia-sip-ua/nua/check_register.c index 0dea54f87c..8ca0bb2aff 100644 --- a/libs/sofia-sip/libsofia-sip-ua/nua/check_register.c +++ b/libs/sofia-sip/libsofia-sip-ua/nua/check_register.c @@ -265,6 +265,10 @@ static nua_handle_t *make_auth_natted_register( m = s2_wait_for_request(SIP_METHOD_REGISTER); fail_if(!m); fail_if(!m->sip->sip_authorization); + /* should not unregister the previous contact + * as it has not been successfully registered */ + fail_if(!m->sip->sip_contact); + fail_if(m->sip->sip_contact->m_next); s2_save_register(m); s2_respond_to(m, NULL, diff --git a/libs/sofia-sip/libsofia-sip-ua/nua/outbound.c b/libs/sofia-sip/libsofia-sip-ua/nua/outbound.c index 8d9b204c75..d5dc89d688 100644 --- a/libs/sofia-sip/libsofia-sip-ua/nua/outbound.c +++ b/libs/sofia-sip/libsofia-sip-ua/nua/outbound.c @@ -102,7 +102,7 @@ struct outbound { /* The registration state machine. */ /** Initial REGISTER containing ob_rcontact has been sent */ unsigned ob_registering:1; - /** 2XX response to REGISTER containg ob_rcontact has been received */ + /** 2XX response to REGISTER containing ob_rcontact has been received */ unsigned ob_registered:1; /** The registration has been validated: * We have successfully sent OPTIONS to ourselves. @@ -361,14 +361,6 @@ int outbound_get_contacts(outbound_t *ob, if (ob) { if (ob->ob_contacts) *return_current_contact = ob->ob_rcontact; - else { - sip_contact_t *contact = *return_current_contact; - if (contact) { - if (ob->ob_rcontact) - msg_header_free_all(ob->ob_home, (msg_header_t*)ob->ob_rcontact); - ob->ob_rcontact = sip_contact_dup(ob->ob_home, contact); - } - } *return_previous_contact = ob->ob_previous; } return 0; @@ -402,21 +394,25 @@ int outbound_register_response(outbound_t *ob, return 0; assert(request->sip_request); assert(response->sip_status); - - reregister = outbound_check_for_nat(ob, request, response); - if (reregister) - return reregister; status = response->sip_status->st_status; if (status < 300) { - if (request->sip_contact && response->sip_contact) + if (request->sip_contact && response->sip_contact) { + if (ob->ob_rcontact != NULL) + msg_header_free(ob->ob_home, (msg_header_t *)ob->ob_rcontact); + ob->ob_rcontact = sip_contact_dup(ob->ob_home, request->sip_contact); ob->ob_registered = ob->ob_registering; - else + } else ob->ob_registered = 0; + } - if (ob->ob_previous) - msg_header_free(ob->ob_home, (void *)ob->ob_previous); + reregister = outbound_check_for_nat(ob, request, response); + if (reregister) + return reregister; + + if (ob->ob_previous && status < 300) { + msg_header_free(ob->ob_home, (void *)ob->ob_previous); ob->ob_previous = NULL; } @@ -1071,7 +1067,6 @@ int outbound_contacts_from_via(outbound_t *ob, sip_via_t const *via) { su_home_t *home = ob->ob_home; sip_contact_t *rcontact, *dcontact; - int reg_id = 0; char reg_id_param[20] = ""; sip_contact_t *previous_previous, *previous_rcontact, *previous_dcontact; sip_via_t *v, v0[1], *previous_via; @@ -1110,8 +1105,10 @@ int outbound_contacts_from_via(outbound_t *ob, sip_via_t const *via) previous_dcontact = ob->ob_dcontact; previous_via = ob->ob_via; - if (ob->ob_registering && - (reg_id == 0 || ob->ob_info.outbound < outbound_feature_supported)) + if (ob->ob_registered + /* && (ob->ob_reg_id == 0 || ob->ob_info.outbound < outbound_feature_supported) + * XXX - multiple connections not yet supported + */) previous_rcontact = NULL, ob->ob_previous = ob->ob_rcontact; else previous_rcontact = ob->ob_rcontact, ob->ob_previous = NULL;