From ea4b67fdc1ccd2dfc52f096308174d3c26fba993 Mon Sep 17 00:00:00 2001 From: Ganesh Murthy Date: Thu, 10 May 2018 10:20:50 -0400 Subject: [PATCH] DISPATCH-994 - Added null checks on links/connections before enqueing actions or calling action inseting functions --- src/router_core/connections.c | 12 ++++++++---- src/router_node.c | 36 ++++++++++++++++++++++++----------- 2 files changed, 33 insertions(+), 15 deletions(-) diff --git a/src/router_core/connections.c b/src/router_core/connections.c index 0e655d3e96..e1231f62f3 100644 --- a/src/router_core/connections.c +++ b/src/router_core/connections.c @@ -117,7 +117,8 @@ void qdr_connection_closed(qdr_connection_t *conn) { qdr_action_t *action = qdr_action(qdr_connection_closed_CT, "connection_closed"); action->args.connection.conn = conn; - qdr_action_enqueue(conn->core, action); + if (conn) + qdr_action_enqueue(conn->core, action); } bool qdr_connection_route_container(qdr_connection_t *conn) @@ -473,7 +474,8 @@ void qdr_link_second_attach(qdr_link_t *link, qdr_terminus_t *source, qdr_termin action->args.connection.link = link; action->args.connection.source = source; action->args.connection.target = target; - qdr_action_enqueue(link->core, action); + if (link) + qdr_action_enqueue(link->core, action); } @@ -485,7 +487,8 @@ void qdr_link_detach(qdr_link_t *link, qd_detach_type_t dt, qdr_error_t *error) action->args.connection.link = link; action->args.connection.error = error; action->args.connection.dt = dt; - qdr_action_enqueue(link->core, action); + if (link) + qdr_action_enqueue(link->core, action); } @@ -494,7 +497,8 @@ void qdr_link_delete(qdr_link_t *link) qdr_action_t *action = qdr_action(qdr_link_delete_CT, "link_delete"); action->args.connection.link = link; - qdr_action_enqueue(link->core, action); + if (link) + qdr_action_enqueue(link->core, action); } diff --git a/src/router_node.c b/src/router_node.c index 39da87df0b..1003cb5135 100644 --- a/src/router_node.c +++ b/src/router_node.c @@ -631,15 +631,17 @@ static int AMQP_incoming_link_handler(void* context, qd_link_t *link) qdr_connection_t *qdr_conn = (qdr_connection_t*) qd_connection_get_context(conn); - char *terminus_addr = (char*)pn_terminus_get_address(pn_link_remote_target((pn_link_t *)qd_link_pn(link))); - - qdr_link_t *qdr_link = qdr_link_first_attach(qdr_conn, QD_INCOMING, - qdr_terminus(qd_link_remote_source(link)), - qdr_terminus(qd_link_remote_target(link)), - pn_link_name(qd_link_pn(link)), - terminus_addr); - qdr_link_set_context(qdr_link, link); - qd_link_set_context(link, qdr_link); + if (qdr_conn) { + char *terminus_addr = (char*)pn_terminus_get_address(pn_link_remote_target((pn_link_t *)qd_link_pn(link))); + + qdr_link_t *qdr_link = qdr_link_first_attach(qdr_conn, QD_INCOMING, + qdr_terminus(qd_link_remote_source(link)), + qdr_terminus(qd_link_remote_target(link)), + pn_link_name(qd_link_pn(link)), + terminus_addr); + qdr_link_set_context(qdr_link, link); + qd_link_set_context(link, qdr_link); + } return 0; } @@ -677,6 +679,10 @@ static int AMQP_outgoing_link_handler(void* context, qd_link_t *link) static int AMQP_link_attach_handler(void* context, qd_link_t *link) { qdr_link_t *qlink = (qdr_link_t*) qd_link_get_context(link); + + if (!qlink) + return 0; + qdr_link_second_attach(qlink, qdr_terminus(qd_link_remote_source(link)), qdr_terminus(qd_link_remote_target(link))); @@ -697,6 +703,9 @@ static int AMQP_link_flow_handler(void* context, qd_link_t *link) if (!rlink) return 0; + if (!pnlink) + return 0; + qdr_link_flow(router->router_core, rlink, pn_link_remote_credit(pnlink), pn_link_get_drain(pnlink)); return 0; @@ -746,6 +755,9 @@ static void bind_connection_context(qdr_connection_t *qdrc, void* token) static void AMQP_opened_handler(qd_router_t *router, qd_connection_t *conn, bool inbound) { + if (!conn) + return; + qdr_connection_role_t role = 0; int cost = 1; int remote_cost = 1; @@ -1014,7 +1026,8 @@ static void AMQP_opened_handler(qd_router_t *router, qd_connection_t *conn, bool static int AMQP_inbound_opened_handler(void *type_context, qd_connection_t *conn, void *context) { qd_router_t *router = (qd_router_t*) type_context; - AMQP_opened_handler(router, conn, true); + if (conn) + AMQP_opened_handler(router, conn, true); return 0; } @@ -1022,7 +1035,8 @@ static int AMQP_inbound_opened_handler(void *type_context, qd_connection_t *conn static int AMQP_outbound_opened_handler(void *type_context, qd_connection_t *conn, void *context) { qd_router_t *router = (qd_router_t*) type_context; - AMQP_opened_handler(router, conn, false); + if (conn) + AMQP_opened_handler(router, conn, false); return 0; }