12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- diff --git a/pjproject/pjsip/src/pjsip/sip_transport.c b/pjproject_new/pjsip/src/pjsip/sip_transport.c
- index 4b2cc1a..22e3603 100644
- --- a/pjsip/src/pjsip/sip_transport.c
- +++ b/pjsip/src/pjsip/sip_transport.c
- @@ -1248,22 +1248,22 @@ PJ_DEF(pj_status_t) pjsip_tpmgr_register_tpfactory( pjsip_tpmgr *mgr,
-
- pj_lock_acquire(mgr->lock);
-
- - /* Check that no factory with the same type has been registered. */
- + /* Check that no factory with the same type and bound address has been registered. */
- status = PJ_SUCCESS;
- for (p=mgr->factory_list.next; p!=&mgr->factory_list; p=p->next) {
- - if (p->type == tpf->type) {
- - status = PJSIP_ETYPEEXISTS;
- - break;
- - }
- - if (p == tpf) {
- - status = PJ_EEXISTS;
- - break;
- - }
- + if (p->type == tpf->type && !pj_sockaddr_cmp(&tpf->local_addr, &p->local_addr)) {
- + status = PJSIP_ETYPEEXISTS;
- + break;
- + }
- + if (p == tpf) {
- + status = PJ_EEXISTS;
- + break;
- + }
- }
-
- if (status != PJ_SUCCESS) {
- - pj_lock_release(mgr->lock);
- - return status;
- + pj_lock_release(mgr->lock);
- + return status;
- }
-
- pj_list_insert_before(&mgr->factory_list, tpf);
- @@ -2047,13 +2047,11 @@ PJ_DEF(pj_status_t) pjsip_tpmgr_acquire_transport2(pjsip_tpmgr *mgr,
- pj_memcpy(&key.rem_addr, remote, addr_len);
-
- transport = (pjsip_transport*)
- - pj_hash_get(mgr->table, &key, key_len, NULL);
- -
- + pj_hash_get(mgr->table, &key, key_len, NULL);
- + unsigned flag = pjsip_transport_get_flag_from_type(type);
- if (transport == NULL) {
- - unsigned flag = pjsip_transport_get_flag_from_type(type);
- const pj_sockaddr *remote_addr = (const pj_sockaddr*)remote;
-
- -
- /* Ignore address for loop transports. */
- if (type == PJSIP_TRANSPORT_LOOP ||
- type == PJSIP_TRANSPORT_LOOP_DGRAM)
- @@ -2135,6 +2135,11 @@ PJ_DEF(pj_status_t) pjsip_tpmgr_acquire_transport2(pjsip_tpmgr *mgr,
- }
-
- } else {
- + /* Make sure we don't use another factory than the one given if secure flag is set */
- + if (flag & PJSIP_TRANSPORT_SECURE) {
- + TRACE_((THIS_FILE, "Can't create new TLS transport with no provided suitable TLS listener."));
- + return PJSIP_ETPNOTSUITABLE;
- + }
-
- /* Find factory with type matches the destination type */
- factory = mgr->factory_list.next;
|