This is an automated email from the ASF dual-hosted git repository. tross pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/qpid-dispatch.git
commit c47b976df339ea896b2ba5cf535b9bc07c13534c Author: Ted Ross <tr...@redhat.com> AuthorDate: Thu Mar 21 12:53:50 2019 -0400 DISPATCH-1299 - Added safe-reference feature to the alloc-pool module. Note: alloc-malloc also has the same interface (will build), but does not provide the same safety. --- include/qpid/dispatch/alloc_malloc.h | 17 +++++++++++++--- include/qpid/dispatch/alloc_pool.h | 12 ++++++++++- include/qpid/dispatch/container.h | 2 ++ src/container.c | 1 - src/router_core/core_client_api.c | 2 ++ src/router_core/core_timer.c | 1 - .../address_lookup_server/address_lookup_server.c | 1 + src/router_core/modules/edge_router/edge_mgmt.c | 1 + .../modules/edge_router/link_route_proxy.c | 1 + tests/alloc_test.c | 23 ++++++++++++++++++++++ 10 files changed, 55 insertions(+), 6 deletions(-) diff --git a/include/qpid/dispatch/alloc_malloc.h b/include/qpid/dispatch/alloc_malloc.h index 12d683e..d89ed28 100644 --- a/include/qpid/dispatch/alloc_malloc.h +++ b/include/qpid/dispatch/alloc_malloc.h @@ -21,6 +21,7 @@ #include <stdint.h> #include <string.h> +#include <qpid/dispatch/ctools.h> /** *@file @@ -29,9 +30,17 @@ * Useful for debugging with tools like valgrind. */ -#define ALLOC_DECLARE(T) \ - T *new_##T(void); \ - void free_##T(T *p) +typedef struct { + void *ptr; + uint32_t seq; +} qd_alloc_safe_ptr_t; + +#define ALLOC_DECLARE(T) \ + T *new_##T(void); \ + void free_##T(T *p); \ + typedef qd_alloc_safe_ptr_t T##_sp; \ + void set_safe_ptr_##T(T *p, T##_sp *sp); \ + T *safe_deref_##T(T##_sp sp) #define ALLOC_DEFINE_CONFIG(T,S,A,C) \ T *new_##T(void) { size_t *a = (A); \ @@ -41,6 +50,8 @@ void free_##T(T *p) { size_t *a = (A); \ QD_MEMORY_FILL(p, QD_MEMORY_FREE, (S) + (a ? *a : 0)); \ free(p); } \ + void set_safe_ptr_##T(T *p, T##_sp *sp) { sp->ptr = (void*) p; sp->seq = qd_alloc_sequence((void*) p); } \ + T *safe_deref_##T(T##_sp sp) { return sp.seq == qd_alloc_sequence((void*) sp.ptr) ? (T*) sp.ptr : (T*) 0; } \ void *unused##T #define ALLOC_DEFINE(T) ALLOC_DEFINE_CONFIG(T, sizeof(T), 0, 0) diff --git a/include/qpid/dispatch/alloc_pool.h b/include/qpid/dispatch/alloc_pool.h index 6b66e88..4f6931c 100644 --- a/include/qpid/dispatch/alloc_pool.h +++ b/include/qpid/dispatch/alloc_pool.h @@ -69,6 +69,11 @@ typedef struct { uint32_t trailer; } qd_alloc_type_desc_t; +typedef struct { + void *ptr; + uint32_t seq; +} qd_alloc_safe_ptr_t; + /** Allocate in a thread pool. Use via ALLOC_DECLARE */ void *qd_alloc(qd_alloc_type_desc_t *desc, qd_alloc_pool_t **tpool); /** De-allocate from a thread pool. Use via ALLOC_DECLARE */ @@ -81,7 +86,10 @@ uint32_t qd_alloc_sequence(void *p); #define ALLOC_DECLARE(T) \ extern __thread qd_alloc_pool_t *__local_pool_##T; \ T *new_##T(void); \ - void free_##T(T *p) + void free_##T(T *p); \ + typedef qd_alloc_safe_ptr_t T##_sp; \ + void set_safe_ptr_##T(T *p, T##_sp *sp); \ + T *safe_deref_##T(T##_sp sp) /** * Define allocator configuration. @@ -92,6 +100,8 @@ uint32_t qd_alloc_sequence(void *p); __thread qd_alloc_pool_t *__local_pool_##T = 0; \ T *new_##T(void) { return (T*) qd_alloc(&__desc_##T, &__local_pool_##T); } \ void free_##T(T *p) { qd_dealloc(&__desc_##T, &__local_pool_##T, (char*) p); } \ + void set_safe_ptr_##T(T *p, T##_sp *sp) { sp->ptr = (void*) p; sp->seq = qd_alloc_sequence((void*) p); } \ + T *safe_deref_##T(T##_sp sp) { return sp.seq == qd_alloc_sequence((void*) sp.ptr) ? (T*) sp.ptr : (T*) 0; } \ qd_alloc_stats_t *alloc_stats_##T(void) { return __desc_##T.stats; } \ void *unused##T diff --git a/include/qpid/dispatch/container.h b/include/qpid/dispatch/container.h index 047ac6e..fd35a48 100644 --- a/include/qpid/dispatch/container.h +++ b/include/qpid/dispatch/container.h @@ -71,6 +71,8 @@ typedef enum { typedef struct qd_node_t qd_node_t; typedef struct qd_link_t qd_link_t; +ALLOC_DECLARE(qd_link_t); + typedef bool (*qd_container_delivery_handler_t) (void *node_context, qd_link_t *link); typedef void (*qd_container_disposition_handler_t) (void *node_context, qd_link_t *link, pn_delivery_t *pnd); typedef int (*qd_container_link_handler_t) (void *node_context, qd_link_t *link); diff --git a/src/container.c b/src/container.c index 2e9bace..12e6930 100644 --- a/src/container.c +++ b/src/container.c @@ -66,7 +66,6 @@ struct qd_link_t { DEQ_DECLARE(qd_link_t, qd_link_list_t); -ALLOC_DECLARE(qd_link_t); ALLOC_DEFINE(qd_link_t); ALLOC_DEFINE(qd_link_ref_t); diff --git a/src/router_core/core_client_api.c b/src/router_core/core_client_api.c index 3b32b31..5810207 100644 --- a/src/router_core/core_client_api.c +++ b/src/router_core/core_client_api.c @@ -55,6 +55,7 @@ struct qdrc_client_request_t { qdrc_client_request_done_CT_t done_cb; }; DEQ_DECLARE(qdrc_client_request_t, qdrc_client_request_list_t); +ALLOC_DECLARE(qdrc_client_request_t); ALLOC_DEFINE(qdrc_client_request_t); @@ -83,6 +84,7 @@ struct qdrc_client_t { qdrc_client_on_flow_CT_t on_flow_cb; }; +ALLOC_DECLARE(qdrc_client_t); ALLOC_DEFINE(qdrc_client_t); diff --git a/src/router_core/core_timer.c b/src/router_core/core_timer.c index d34beb1..7766488 100644 --- a/src/router_core/core_timer.c +++ b/src/router_core/core_timer.c @@ -21,7 +21,6 @@ #include <qpid/dispatch/ctools.h> #include "router_core_private.h" -ALLOC_DECLARE(qdr_core_timer_t); ALLOC_DEFINE(qdr_core_timer_t); void qdr_process_tick_CT(qdr_core_t *core, qdr_action_t *action, bool discard); diff --git a/src/router_core/modules/address_lookup_server/address_lookup_server.c b/src/router_core/modules/address_lookup_server/address_lookup_server.c index 7067aa7..278c675 100644 --- a/src/router_core/modules/address_lookup_server/address_lookup_server.c +++ b/src/router_core/modules/address_lookup_server/address_lookup_server.c @@ -31,6 +31,7 @@ typedef struct _endpoint_ref { const char *container_id; } _endpoint_ref_t; DEQ_DECLARE(_endpoint_ref_t, _endpoint_ref_list_t); +ALLOC_DECLARE(_endpoint_ref_t); ALLOC_DEFINE(_endpoint_ref_t); diff --git a/src/router_core/modules/edge_router/edge_mgmt.c b/src/router_core/modules/edge_router/edge_mgmt.c index e3f8532..beee1c5 100644 --- a/src/router_core/modules/edge_router/edge_mgmt.c +++ b/src/router_core/modules/edge_router/edge_mgmt.c @@ -84,6 +84,7 @@ struct qcm_edge_mgmt_request_t { qcm_edge_mgmt_reply_CT_t reply_callback; qcm_edge_mgmt_error_CT_t error_callback; }; +ALLOC_DECLARE(qcm_edge_mgmt_request_t); ALLOC_DEFINE(qcm_edge_mgmt_request_t); diff --git a/src/router_core/modules/edge_router/link_route_proxy.c b/src/router_core/modules/edge_router/link_route_proxy.c index 44e164b..0e8cb7e 100644 --- a/src/router_core/modules/edge_router/link_route_proxy.c +++ b/src/router_core/modules/edge_router/link_route_proxy.c @@ -46,6 +46,7 @@ struct link_route_proxy_t { link_route_proxy_state_t proxy_state; qd_direction_t direction; }; +ALLOC_DECLARE(link_route_proxy_t); ALLOC_DEFINE(link_route_proxy_t); DEQ_DECLARE(link_route_proxy_t, link_route_proxy_list_t); diff --git a/tests/alloc_test.c b/tests/alloc_test.c index 2f05f0c..6b1262c 100644 --- a/tests/alloc_test.c +++ b/tests/alloc_test.c @@ -72,12 +72,35 @@ static char* test_alloc_basic(void *context) return 0; } + +static char *test_safe_references(void *context) +{ + object_t *obj = new_object_t(); + object_t_sp safe_obj; + + set_safe_ptr_object_t(obj, &safe_obj); + object_t *alias = safe_deref_object_t(safe_obj); + + if (obj != alias) + return "Safe alias was not equal to the original pointer"; + + free_object_t(obj); + alias = safe_deref_object_t(safe_obj); + + if (alias != 0) + return "Safe dereference of a freed object was not null"; + + return 0; +} + + int alloc_tests(void) { int result = 0; char *test_group = "alloc_tests"; TEST_CASE(test_alloc_basic, 0); + TEST_CASE(test_safe_references, 0); return result; } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org For additional commands, e-mail: commits-h...@qpid.apache.org