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