You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by kg...@apache.org on 2019/11/22 18:07:23 UTC

[qpid-dispatch] branch master updated: DISPATCH-1475: use safe pointers in connection/link action messages

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 d6066d1  DISPATCH-1475: use safe pointers in connection/link action messages
d6066d1 is described below

commit d6066d1d1173a68e4e6809073115b01d67f773c6
Author: Kenneth Giusti <kg...@apache.org>
AuthorDate: Fri Nov 22 10:16:51 2019 -0500

    DISPATCH-1475: use safe pointers in connection/link action messages
    
    This closes #627
---
 src/router_core/connections.c         | 69 +++++++++++++++++------------------
 src/router_core/router_core_private.h | 32 ++++++++--------
 src/router_core/transfer.c            |  9 +++--
 3 files changed, 54 insertions(+), 56 deletions(-)

diff --git a/src/router_core/connections.c b/src/router_core/connections.c
index 3594b7e..4dc2092 100644
--- a/src/router_core/connections.c
+++ b/src/router_core/connections.c
@@ -119,7 +119,7 @@ qdr_connection_t *qdr_connection_opened(qdr_core_t            *core,
         context_binder(conn, bind_token);
     }
 
-    action->args.connection.conn             = conn;
+    set_safe_ptr_qdr_connection_t(conn, &action->args.connection.conn);
     action->args.connection.connection_label = qdr_field(label);
     action->args.connection.container_id     = qdr_field(remote_container_id);
     qdr_action_enqueue(core, action);
@@ -131,7 +131,7 @@ qdr_connection_t *qdr_connection_opened(qdr_core_t            *core,
 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;
+    set_safe_ptr_qdr_connection_t(conn, &action->args.connection.conn);
     qdr_action_enqueue(conn->core, action);
 }
 
@@ -556,8 +556,8 @@ qdr_link_t *qdr_link_first_attach(qdr_connection_t *conn,
 
     qdr_link_setup_histogram(conn, dir, link);
 
-    action->args.connection.conn   = conn;
-    action->args.connection.link   = link;
+    set_safe_ptr_qdr_connection_t(conn, &action->args.connection.conn);
+    set_safe_ptr_qdr_link_t(link, &action->args.connection.link);
     action->args.connection.dir    = dir;
     action->args.connection.source = source;
     action->args.connection.target = target;
@@ -571,7 +571,8 @@ void qdr_link_second_attach(qdr_link_t *link, qdr_terminus_t *source, qdr_termin
 {
     qdr_action_t *action = qdr_action(qdr_link_inbound_second_attach_CT, "link_second_attach");
 
-    action->args.connection.link   = link;
+    set_safe_ptr_qdr_connection_t(link->conn, &action->args.connection.conn);
+    set_safe_ptr_qdr_link_t(link, &action->args.connection.link);
     action->args.connection.source = source;
     action->args.connection.target = target;
     qdr_action_enqueue(link->core, action);
@@ -582,8 +583,8 @@ void qdr_link_detach(qdr_link_t *link, qd_detach_type_t dt, qdr_error_t *error)
 {
     qdr_action_t *action = qdr_action(qdr_link_inbound_detach_CT, "link_detach");
 
-    action->args.connection.conn   = link->conn;
-    action->args.connection.link   = link;
+    set_safe_ptr_qdr_connection_t(link->conn, &action->args.connection.conn);
+    set_safe_ptr_qdr_link_t(link, &action->args.connection.link);
     action->args.connection.error  = error;
     action->args.connection.dt     = dt;
     qdr_action_enqueue(link->core, action);
@@ -596,7 +597,7 @@ static void qdr_link_detach_sent(qdr_link_t *link)
 {
     qdr_action_t *action = qdr_action(qdr_link_detach_sent_CT, "link_detach_sent");
 
-    action->args.connection.link = link;
+    set_safe_ptr_qdr_link_t(link, &action->args.connection.link);
     qdr_action_enqueue(link->core, action);
 }
 
@@ -605,7 +606,7 @@ static void qdr_link_processing_complete(qdr_core_t *core, qdr_link_t *link)
 {
     qdr_action_t *action = qdr_action(qdr_link_processing_complete_CT, "link_processing_complete");
 
-    action->args.connection.link = link;
+    set_safe_ptr_qdr_link_t(link, &action->args.connection.link);
     qdr_action_enqueue(core, action);
 }
 
@@ -1264,8 +1265,8 @@ void qdr_check_addr_CT(qdr_core_t *core, qdr_address_t *addr)
 static void qdr_connection_opened_CT(qdr_core_t *core, qdr_action_t *action, bool discard)
 {
 
-    if (!discard) {
-        qdr_connection_t *conn = action->args.connection.conn;
+    qdr_connection_t *conn = safe_deref_qdr_connection_t(action->args.connection.conn);
+    if (!discard && conn) {
 
         do {
             DEQ_ITEM_INIT(conn);
@@ -1343,11 +1344,10 @@ void qdr_connection_free(qdr_connection_t *conn)
 
 static void qdr_connection_closed_CT(qdr_core_t *core, qdr_action_t *action, bool discard)
 {
-    if (discard)
+    qdr_connection_t *conn = safe_deref_qdr_connection_t(action->args.connection.conn);
+    if (discard || !conn)
         return;
 
-    qdr_connection_t *conn = action->args.connection.conn;
-
     //
     // Deactivate routes associated with this connection
     //
@@ -1494,11 +1494,11 @@ static void qdr_attach_link_downlink_CT(qdr_core_t *core, qdr_connection_t *conn
 
 static void qdr_link_inbound_first_attach_CT(qdr_core_t *core, qdr_action_t *action, bool discard)
 {
-    if (discard)
+    qdr_connection_t  *conn = safe_deref_qdr_connection_t(action->args.connection.conn);
+    qdr_link_t        *link = safe_deref_qdr_link_t(action->args.connection.link);
+    if (discard || !conn || !link)
         return;
 
-    qdr_connection_t  *conn   = action->args.connection.conn;
-    qdr_link_t        *link   = action->args.connection.link;
     qd_direction_t     dir    = action->args.connection.dir;
     qdr_terminus_t    *source = action->args.connection.source;
     qdr_terminus_t    *target = action->args.connection.target;
@@ -1642,11 +1642,11 @@ static void qdr_link_inbound_first_attach_CT(qdr_core_t *core, qdr_action_t *act
 
 static void qdr_link_inbound_second_attach_CT(qdr_core_t *core, qdr_action_t *action, bool discard)
 {
-    if (discard)
+    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_link_t       *link   = action->args.connection.link;
-    qdr_connection_t *conn   = link->conn;
     qdr_terminus_t   *source = action->args.connection.source;
     qdr_terminus_t   *target = action->args.connection.target;
 
@@ -1753,11 +1753,11 @@ static void qdr_link_inbound_second_attach_CT(qdr_core_t *core, qdr_action_t *ac
 
 static void qdr_link_inbound_detach_CT(qdr_core_t *core, qdr_action_t *action, bool discard)
 {
-    if (discard)
+    qdr_connection_t *conn = safe_deref_qdr_connection_t(action->args.connection.conn);
+    qdr_link_t       *link = safe_deref_qdr_link_t(action->args.connection.link);
+    if (discard || !conn || !link)
         return;
 
-    qdr_connection_t *conn  = action->args.connection.conn;
-    qdr_link_t       *link  = action->args.connection.link;
     qdr_error_t      *error = action->args.connection.error;
     qd_detach_type_t  dt    = action->args.connection.dt;
     qdr_address_t    *addr  = link->owning_addr;
@@ -1912,26 +1912,23 @@ static void qdr_link_inbound_detach_CT(qdr_core_t *core, qdr_action_t *action, b
  */
 static void qdr_link_detach_sent_CT(qdr_core_t *core, qdr_action_t *action, bool discard)
 {
-    if (discard)
-        return;
+    qdr_link_t *link = safe_deref_qdr_link_t(action->args.connection.link);
 
-    qdr_link_t *link = action->args.connection.link;
+    if (discard || !link)
+        return;
 
-    if (link) {
-        link->detach_send_done = true;
-        if (link->conn && link->detach_received)
-            qdr_link_cleanup_protected_CT(core, link->conn, link, "Link detached");
-    }
+    link->detach_send_done = true;
+    if (link->conn && link->detach_received)
+        qdr_link_cleanup_protected_CT(core, link->conn, link, "Link detached");
 }
 
 
 static void qdr_link_processing_complete_CT(qdr_core_t *core, qdr_action_t *action, bool discard)
 {
-    if (!discard) {
-        qdr_link_t *link = action->args.connection.link;
+    qdr_link_t *link = safe_deref_qdr_link_t(action->args.connection.link);
+    if (discard || !link)
+        return;
 
-        if (link)
-            qdr_link_cleanup_CT(core, link->conn, link, "Link cleanup deferred after IO processing");
-    }
+    qdr_link_cleanup_CT(core, link->conn, link, "Link cleanup deferred after IO processing");
 }
 
diff --git a/src/router_core/router_core_private.h b/src/router_core/router_core_private.h
index 4106db1..cf6d044 100644
--- a/src/router_core/router_core_private.h
+++ b/src/router_core/router_core_private.h
@@ -124,22 +124,22 @@ struct qdr_action_t {
         // Arguments for connection-level actions
         //
         struct {
-            qdr_connection_t *conn;
-            qdr_field_t      *connection_label;
-            qdr_field_t      *container_id;
-            qdr_link_t       *link;
-            qdr_delivery_t   *delivery;
-            qd_message_t     *msg;
-            qd_direction_t    dir;
-            qdr_terminus_t   *source;
-            qdr_terminus_t   *target;
-            qdr_error_t      *error;
-            qd_detach_type_t  dt;
-            int               credit;
-            bool              more;  // true if there are more frames arriving, false otherwise
-            bool              drain;
-            uint8_t           tag[32];
-            int               tag_length;
+            qdr_connection_t_sp  conn;
+            qdr_field_t         *connection_label;
+            qdr_field_t         *container_id;
+            qdr_link_t_sp        link;
+            qdr_delivery_t      *delivery;
+            qd_message_t        *msg;
+            qd_direction_t       dir;
+            qdr_terminus_t      *source;
+            qdr_terminus_t      *target;
+            qdr_error_t         *error;
+            qd_detach_type_t     dt;
+            int                  credit;
+            bool                 more;  // true if there are more frames arriving, false otherwise
+            bool                 drain;
+            uint8_t              tag[32];
+            int                  tag_length;
         } connection;
 
         //
diff --git a/src/router_core/transfer.c b/src/router_core/transfer.c
index 56a064d..60e0efa 100644
--- a/src/router_core/transfer.c
+++ b/src/router_core/transfer.c
@@ -257,7 +257,7 @@ void qdr_link_flow(qdr_core_t *core, qdr_link_t *link, int credit, bool drain_mo
         link->credit_to_core += credit;
     }
 
-    action->args.connection.link   = link;
+    set_safe_ptr_qdr_link_t(link, &action->args.connection.link);
     action->args.connection.credit = credit;
     action->args.connection.drain  = drain_mode;
 
@@ -297,16 +297,17 @@ void qdr_send_to2(qdr_core_t *core, qd_message_t *msg, const char *addr, bool ex
 
 static void qdr_link_flow_CT(qdr_core_t *core, qdr_action_t *action, bool discard)
 {
-    if (discard)
+    qdr_link_t *link = safe_deref_qdr_link_t(action->args.connection.link);
+
+    if (discard || !link)
         return;
 
-    qdr_link_t *link      = action->args.connection.link;
     int  credit           = action->args.connection.credit;
     bool drain            = action->args.connection.drain;
     bool activate         = false;
     bool drain_was_set    = !link->drain_mode && drain;
     qdr_link_work_t *work = 0;
-    
+
     link->drain_mode = drain;
 
     //


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