summaryrefslogtreecommitdiffstats
path: root/libraries/pjproject-ring/patches/multiple_listeners.patch
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/pjproject-ring/patches/multiple_listeners.patch')
-rw-r--r--libraries/pjproject-ring/patches/multiple_listeners.patch66
1 files changed, 66 insertions, 0 deletions
diff --git a/libraries/pjproject-ring/patches/multiple_listeners.patch b/libraries/pjproject-ring/patches/multiple_listeners.patch
new file mode 100644
index 0000000000..89590107c8
--- /dev/null
+++ b/libraries/pjproject-ring/patches/multiple_listeners.patch
@@ -0,0 +1,66 @@
+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;