This is an automated email from the ASF dual-hosted git repository.

chug pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/qpid-dispatch.git


The following commit(s) were added to refs/heads/master by this push:
     new fbba355  DISPATCH-1614: Nullify address inlink and outlink when 
connection lost
fbba355 is described below

commit fbba3554db0a20e993865ba25a17ae0295cb3911
Author: Chuck Rolke <c...@apache.org>
AuthorDate: Mon Apr 6 16:56:54 2020 -0400

    DISPATCH-1614: Nullify address inlink and outlink when connection lost
    
    Prevent segfault referencing deleted links when connection is lost.
    Assert that the pointers are null when a connection is created.
    
    This closes #714
---
 src/router_core/modules/edge_router/addr_proxy.c | 7 +++++++
 src/router_core/router_core.c                    | 6 ++++++
 2 files changed, 13 insertions(+)

diff --git a/src/router_core/modules/edge_router/addr_proxy.c 
b/src/router_core/modules/edge_router/addr_proxy.c
index 7ed6d08..a9c9989 100644
--- a/src/router_core/modules/edge_router/addr_proxy.c
+++ b/src/router_core/modules/edge_router/addr_proxy.c
@@ -271,7 +271,9 @@ static void on_conn_event(void *context, qdrc_event_t 
event, qdr_connection_t *c
                 // Nullify the edge link references in case there are any left 
over from an earlier
                 // instance of an edge connection.
                 //
+                assert(addr->edge_inlink  == 0);
                 addr->edge_inlink  = 0;
+                assert(addr->edge_outlink == 0);
                 addr->edge_outlink = 0;
 
                 //
@@ -323,6 +325,11 @@ static void on_conn_event(void *context, qdrc_event_t 
event, qdr_connection_t *c
     }
 
     case QDRC_EVENT_CONN_EDGE_LOST :
+        for (qdr_address_t *addr = DEQ_HEAD(ap->core->addrs); addr; addr = 
DEQ_NEXT(addr)) {
+            addr->edge_inlink  = 0;
+            addr->edge_outlink = 0;
+        }
+
         ap->edge_conn_established = false;
         ap->edge_conn             = 0;
         break;
diff --git a/src/router_core/router_core.c b/src/router_core/router_core.c
index d5feb88..1a01ed3 100644
--- a/src/router_core/router_core.c
+++ b/src/router_core/router_core.c
@@ -581,6 +581,9 @@ void qdr_core_unbind_address_link_CT(qdr_core_t *core, 
qdr_address_t *addr, qdr_
             qdrc_event_addr_raise(core, QDRC_EVENT_ADDR_NO_LONGER_LOCAL_DEST, 
addr);
         } else if (DEQ_SIZE(addr->rlinks) == 1 && 
qd_bitmask_cardinality(addr->rnodes) == 0)
             qdrc_event_addr_raise(core, QDRC_EVENT_ADDR_ONE_LOCAL_DEST, addr);
+        if (addr->edge_outlink == link) {
+            addr->edge_outlink = 0;
+        }
     } else {
         bool removed = qdr_del_link_ref(&addr->inlinks, link, 
QDR_LINK_LIST_CLASS_ADDRESS);
         if (removed) {
@@ -594,6 +597,9 @@ void qdr_core_unbind_address_link_CT(qdr_core_t *core, 
qdr_address_t *addr, qdr_
                     qdrc_event_addr_raise(core, QDRC_EVENT_ADDR_ONE_SOURCE, 
addr->fallback);
             }
         }
+        if (addr->edge_inlink == link) {
+            addr->edge_inlink = 0;
+        }
     }
 }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org
For additional commands, e-mail: commits-h...@qpid.apache.org

Reply via email to