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

kgiusti 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 0e4c8d8  DISPATCH-1549: properly free terminus on transactional link 
rejection
0e4c8d8 is described below

commit 0e4c8d8bd6a66b1f0c5dab2e1c6bb19c59f2933c
Author: Kenneth Giusti <kgiu...@apache.org>
AuthorDate: Thu Jan 16 11:58:31 2020 -0500

    DISPATCH-1549: properly free terminus on transactional link rejection
---
 src/router_core/connections.c                      | 11 +++++---
 .../modules/address_lookup_client/lookup_client.c  | 29 ++++++++++------------
 tests/lsan.supp                                    |  1 -
 3 files changed, 21 insertions(+), 20 deletions(-)

diff --git a/src/router_core/connections.c b/src/router_core/connections.c
index 1a44baf..b7284a4 100644
--- a/src/router_core/connections.c
+++ b/src/router_core/connections.c
@@ -573,6 +573,8 @@ void qdr_link_second_attach(qdr_link_t *link, 
qdr_terminus_t *source, qdr_termin
 
     set_safe_ptr_qdr_connection_t(link->conn, &action->args.connection.conn);
     set_safe_ptr_qdr_link_t(link, &action->args.connection.link);
+
+    // ownership of source/target passed to core, core must free them when done
     action->args.connection.source = source;
     action->args.connection.target = target;
     qdr_action_enqueue(link->core, action);
@@ -1647,12 +1649,15 @@ static void 
qdr_link_inbound_second_attach_CT(qdr_core_t *core, qdr_action_t *ac
 {
     qdr_link_t       *link = 
safe_deref_qdr_link_t(action->args.connection.link);
     qdr_connection_t *conn = 
safe_deref_qdr_connection_t(action->args.connection.conn);
-    if (discard || !link || !conn)
-        return;
-
     qdr_terminus_t   *source = action->args.connection.source;
     qdr_terminus_t   *target = action->args.connection.target;
 
+    if (discard || !link || !conn) {
+        qdr_terminus_free(source);
+        qdr_terminus_free(target);
+        return;
+    }
+
     link->oper_status = QDR_LINK_OPER_UP;
     link->attach_count++;
 
diff --git a/src/router_core/modules/address_lookup_client/lookup_client.c 
b/src/router_core/modules/address_lookup_client/lookup_client.c
index aa6f968..ea4c888 100644
--- a/src/router_core/modules/address_lookup_client/lookup_client.c
+++ b/src/router_core/modules/address_lookup_client/lookup_client.c
@@ -326,8 +326,8 @@ static void qdr_link_react_to_first_attach_CT(qdr_core_t    
   *core,
                                               qdr_address_t    *addr,
                                               qdr_link_t       *link,
                                               qd_direction_t    dir,
-                                              qdr_terminus_t   *source,
-                                              qdr_terminus_t   *target,
+                                              qdr_terminus_t   *source,  // 
must free when done
+                                              qdr_terminus_t   *target,  // 
must free when done
                                               bool              link_route,
                                               bool              unavailable,
                                               bool              core_endpoint,
@@ -337,27 +337,20 @@ static void qdr_link_react_to_first_attach_CT(qdr_core_t  
     *core,
 
     if (core_endpoint) {
         qdrc_endpoint_do_bound_attach_CT(core, addr, link, source, target);
+        source = target = 0;  // ownership passed to 
qdrc_endpoint_do_bound_attach_CT
     }
     else if (unavailable && qdr_terminus_is_coordinator(dir == QD_INCOMING ? 
target : source) && !addr) {
         qdr_link_outbound_detach_CT(core, link, 0, 
QDR_CONDITION_COORDINATOR_PRECONDITION_FAILED, true);
-        qdr_terminus_free(source);
-        qdr_terminus_free(target);
     }
     else if (unavailable) {
         qdr_link_outbound_detach_CT(core, link, 
qdr_error(QD_AMQP_COND_NOT_FOUND, "Node not found"), 0, true);
-        qdr_terminus_free(source);
-        qdr_terminus_free(target);
     }
-
     else if (!addr) {
         //
         // No route to this destination, reject the link
         //
         qdr_link_outbound_detach_CT(core, link, 0, 
QDR_CONDITION_NO_ROUTE_TO_DESTINATION, true);
-        qdr_terminus_free(source);
-        qdr_terminus_free(target);
     }
-
     else if (link_route) {
         //
         // This is a link-routed destination, forward the attach to the next 
hop
@@ -365,21 +358,18 @@ static void qdr_link_react_to_first_attach_CT(qdr_core_t  
     *core,
         qdr_terminus_t *term = dir == QD_INCOMING ? target : source;
         if (qdr_terminus_survives_disconnect(term) && 
!core->qd->allow_resumable_link_route) {
             qdr_link_outbound_detach_CT(core, link, 0, 
QDR_CONDITION_INVALID_LINK_EXPIRATION, true);
-            qdr_terminus_free(source);
-            qdr_terminus_free(target);
         } else {
             if (conn->role != QDR_ROLE_INTER_ROUTER && conn->connection_info) {
                 link->disambiguated_name = 
disambiguated_link_name(conn->connection_info, link->name);
             }
             bool success = qdr_forward_attach_CT(core, addr, link, source, 
target);
-            if (!success) {
+            if (success) {
+                source = target = 0;  // ownership passed to 
qdr_forward_attach_CT
+            } else {
                 qdr_link_outbound_detach_CT(core, link, 0, 
QDR_CONDITION_NO_ROUTE_TO_DESTINATION, true);
-                qdr_terminus_free(source);
-                qdr_terminus_free(target);
             }
         }
     }
-
     else if (dir == QD_INCOMING && qdr_terminus_is_coordinator(target)) {
         //
         // This target terminus is a coordinator.
@@ -389,6 +379,7 @@ static void qdr_link_react_to_first_attach_CT(qdr_core_t    
   *core,
         // The attach response should have a null target to indicate refusal 
and the immediately coming detach.
         //
         qdr_link_outbound_second_attach_CT(core, link, source, 0);
+        source = 0;  // ownership passed to qdr_link_outbound_second_attach_CT
 
         //
         // Now, send back a detach with the error amqp:precondition-failed
@@ -401,6 +392,7 @@ static void qdr_link_react_to_first_attach_CT(qdr_core_t    
   *core,
         //
         qdr_core_bind_address_link_CT(core, addr, link);
         qdr_link_outbound_second_attach_CT(core, link, source, target);
+        source = target = 0;  // ownership passed to 
qdr_link_outbound_second_attach_CT
 
         //
         // Issue the initial credit only if one of the following
@@ -427,6 +419,11 @@ static void qdr_link_react_to_first_attach_CT(qdr_core_t   
    *core,
         if (link->conn->role == QDR_ROLE_EDGE_CONNECTION)
             qdrc_event_link_raise(core, QDRC_EVENT_LINK_EDGE_DATA_ATTACHED, 
link);
     }
+
+    if (source)
+        qdr_terminus_free(source);
+    if (target)
+        qdr_terminus_free(target);
 }
 
 
diff --git a/tests/lsan.supp b/tests/lsan.supp
index a37c399..765aef8 100644
--- a/tests/lsan.supp
+++ b/tests/lsan.supp
@@ -35,7 +35,6 @@ leak:qdr_route_add_auto_link_CT
 leak:qdr_route_add_link_route_CT
 leak:qdr_route_connection_opened_CT
 leak:qdr_subscribe_CT
-leak:qdr_terminus
 leak:router_annotate_message
 leak:qd_container_register_node_type
 


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

Reply via email to