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