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

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


The following commit(s) were added to refs/heads/main by this push:
     new a2785d2  DISPATCH-2274: Fix use after free of qd_link_t by using safe 
pointer as context
a2785d2 is described below

commit a2785d25e0ce2c0c9253fe26ab7d8470d6912b6d
Author: Ganesh Murthy <[email protected]>
AuthorDate: Thu Nov 4 17:09:58 2021 -0400

    DISPATCH-2274: Fix use after free of qd_link_t by using safe pointer as 
context
---
 src/router_core/connections.c | 35 +++++++++++++++++++++++++++++++----
 src/router_core/router_core.c |  4 +++-
 2 files changed, 34 insertions(+), 5 deletions(-)

diff --git a/src/router_core/connections.c b/src/router_core/connections.c
index 840b82f..08acb51 100644
--- a/src/router_core/connections.c
+++ b/src/router_core/connections.c
@@ -488,14 +488,39 @@ int qdr_connection_process(qdr_connection_t *conn)
 
 void qdr_link_set_context(qdr_link_t *link, void *context)
 {
-    if (link)
-        link->user_context = context;
+    if (link) {
+        if (context == 0) {
+            if (link->user_context) {
+                qd_nullify_safe_ptr((qd_alloc_safe_ptr_t *)link->user_context);
+                free(link->user_context);
+                link->user_context = 0;
+            }
+        }
+        else {
+            if (link->user_context) {
+                qd_nullify_safe_ptr((qd_alloc_safe_ptr_t *)link->user_context);
+                free(link->user_context);
+            }
+
+            qd_link_t_sp *safe_ptr = NEW(qd_alloc_safe_ptr_t);
+            set_safe_ptr_qd_link_t(context, safe_ptr);
+            link->user_context = safe_ptr;
+        }
+    }
 }
 
 
 void *qdr_link_get_context(const qdr_link_t *link)
 {
-    return link ? link->user_context : 0;
+    if (link) {
+        if (link->user_context) {
+            qd_link_t_sp *safe_qdl = (qd_link_t_sp*) link->user_context;
+            if (safe_qdl)
+                return safe_deref_qd_link_t(*safe_qdl);
+        }
+    }
+
+    return 0;
 }
 
 
@@ -1090,7 +1115,9 @@ static void qdr_link_cleanup_CT(qdr_core_t *core, 
qdr_connection_t *conn, qdr_li
 
     if (link->reported_as_blocked)
         core->links_blocked--;
-
+    if (link->user_context) {
+        qdr_link_set_context(link, 0);
+    }
     free_qdr_link_t(link);
 }
 
diff --git a/src/router_core/router_core.c b/src/router_core/router_core.c
index fb506c6..08293e3 100644
--- a/src/router_core/router_core.c
+++ b/src/router_core/router_core.c
@@ -244,7 +244,9 @@ void qdr_core_free(qdr_core_t *core)
             link_work = DEQ_HEAD(link->work_list);
         }
         sys_mutex_unlock(link->conn->work_lock);
-
+        if (link->user_context) {
+            qdr_link_set_context(link, 0);
+        }
         free_qdr_link_t(link);
         link = DEQ_HEAD(core->open_links);
     }

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to