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 2018/12/13 19:44:25 UTC

qpid-dispatch git commit: DISPATCH-1222: clean up various issues reported by coverity

Repository: qpid-dispatch
Updated Branches:
  refs/heads/master a3be94a6d -> 16674f44b


DISPATCH-1222: clean up various issues reported by coverity


Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/16674f44
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/16674f44
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/16674f44

Branch: refs/heads/master
Commit: 16674f44b0cdf037614e8e4378e24e9af0eb7ab9
Parents: a3be94a
Author: Kenneth Giusti <kg...@apache.org>
Authored: Thu Dec 13 14:28:37 2018 -0500
Committer: Kenneth Giusti <kg...@apache.org>
Committed: Thu Dec 13 14:35:23 2018 -0500

----------------------------------------------------------------------
 src/address_lookup_utils.c                      |  17 +-
 src/message.c                                   |   1 -
 src/router_core/core_client_api.c               |   8 +-
 .../address_lookup_client/lookup_client.c       |   2 -
 .../address_lookup_server.c                     |   5 +-
 src/router_core/modules/edge_router/edge_mgmt.c |  12 +-
 .../modules/test_hooks/core_test_hooks.c        |   6 +-
 tests/field_test.c                              |  96 +++++--
 tests/message_test.c                            |  69 +++++-
 tests/parse_test.c                              |  61 +++--
 tests/parse_tree_tests.c                        | 248 ++++++++++++++-----
 tests/policy_test.c                             |  66 +++--
 tests/tool_test.c                               |  80 ++++--
 13 files changed, 507 insertions(+), 164 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/16674f44/src/address_lookup_utils.c
----------------------------------------------------------------------
diff --git a/src/address_lookup_utils.c b/src/address_lookup_utils.c
index 9935cf5..c7846d7 100644
--- a/src/address_lookup_utils.c
+++ b/src/address_lookup_utils.c
@@ -66,18 +66,23 @@ qcm_address_lookup_status_t qcm_link_route_lookup_decode(qd_iterator_t *properti
                                                          bool          *is_link_route,
                                                          bool          *has_destinations)
 {
+    qd_parsed_field_t *props = NULL;
+    qd_parsed_field_t *bod = NULL;
+
     qcm_address_lookup_status_t rc = QCM_ADDR_LOOKUP_OK;
     *is_link_route = false;
     *has_destinations = false;
 
-    qd_parsed_field_t *props = qd_parse(properties);
-    if (!props || !qd_parse_ok(props) || !qd_parse_is_map(props))
-        return QCM_ADDR_LOOKUP_INVALID_REQUEST;
+    props = qd_parse(properties);
+    if (!props || !qd_parse_ok(props) || !qd_parse_is_map(props)) {
+        rc = QCM_ADDR_LOOKUP_INVALID_REQUEST;
+        goto exit;
+    }
 
-    qd_parsed_field_t *bod = qd_parse(body);
+    bod = qd_parse(body);
     if (!bod || !qd_parse_ok(bod) || !qd_parse_is_list(bod)) {
-        qd_parse_free(props);
-        return QCM_ADDR_LOOKUP_INVALID_REQUEST;
+        rc = QCM_ADDR_LOOKUP_INVALID_REQUEST;
+        goto exit;
     }
 
     qd_parsed_field_t *tmp = qd_parse_value_by_key(props, "status");

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/16674f44/src/message.c
----------------------------------------------------------------------
diff --git a/src/message.c b/src/message.c
index d82a670..16060d3 100644
--- a/src/message.c
+++ b/src/message.c
@@ -788,7 +788,6 @@ static void qd_message_parse_priority(qd_message_t *in_msg)
                 qd_parsed_field_t *priority_field = qd_parse_sub_value(field, 1);
                 if (qd_parse_tag(priority_field) != QD_AMQP_NULL) {
                     uint32_t value = qd_parse_as_uint(priority_field);
-                    content->priority = value >= QDR_N_PRIORITIES ? QDR_N_PRIORITIES - 1 : (uint8_t) (value & 0x00ff);
                     content->priority = value > QDR_MAX_PRIORITY ? QDR_MAX_PRIORITY : (uint8_t) (value & 0x00ff);
                     content->priority_present = true;
                 }

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/16674f44/src/router_core/core_client_api.c
----------------------------------------------------------------------
diff --git a/src/router_core/core_client_api.c b/src/router_core/core_client_api.c
index 4967aec..45c7150 100644
--- a/src/router_core/core_client_api.c
+++ b/src/router_core/core_client_api.c
@@ -237,7 +237,7 @@ int qdrc_client_request_CT(qdrc_client_t                 *client,
                            qdrc_client_request_done_CT_t  done_cb)
 {
     qd_log(client->core->log, QD_LOG_TRACE,
-           "New core client request created c=%p, rc=%"PRIuPTR,
+           "New core client request created c=%p, rc=%p",
            client, request_context);
 
     qdrc_client_request_t *req = new_qdrc_client_request_t();
@@ -294,7 +294,7 @@ static void _flush_send_queue_CT(qdrc_client_t *client)
         req->on_send_queue = false;
 
         qd_log(client->core->log, QD_LOG_TRACE,
-               "Core client request sent c=%p, rc=%"PRIuPTR" dlv=%p cid=%s",
+               "Core client request sent c=%p, rc=%p dlv=%p cid=%s",
                client, req->req_context, req->delivery,
                *req->correlation_id ? req->correlation_id : "<none>");
 
@@ -357,7 +357,7 @@ static void _free_request_CT(qdrc_client_t *client,
     }
 
     qd_log(client->core->log, QD_LOG_TRACE,
-           "Freeing core client request c=%p, rc=%"PRIuPTR" (%s)",
+           "Freeing core client request c=%p, rc=%p (%s)",
            client, req->req_context,
            error ? error : "request complete");
 
@@ -519,7 +519,7 @@ static void _receiver_transfer_CT(void *client_context,
             if (req) {
 
                 qd_log(core->log, QD_LOG_TRACE,
-                       "Core client received msg c=%p rc=%"PRIuPTR" cid=%s",
+                       "Core client received msg c=%p rc=%p cid=%s",
                        client, req->req_context, req->correlation_id);
 
                 qd_hash_remove_by_handle(client->correlations, req->hash_handle);

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/16674f44/src/router_core/modules/address_lookup_client/lookup_client.c
----------------------------------------------------------------------
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 483c3c2..5e6d4a7 100644
--- a/src/router_core/modules/address_lookup_client/lookup_client.c
+++ b/src/router_core/modules/address_lookup_client/lookup_client.c
@@ -559,8 +559,6 @@ static void on_state(qdr_core_t    *core,
         while (request) {
             DEQ_REMOVE_HEAD(client->pending_requests);
             qcm_addr_lookup_local_search(client, request);
-            qdr_terminus_free(request->source);
-            qdr_terminus_free(request->target);
             free_qcm_addr_lookup_request_t(request);
             request = DEQ_HEAD(client->pending_requests);
         }

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/16674f44/src/router_core/modules/address_lookup_server/address_lookup_server.c
----------------------------------------------------------------------
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 b37e23d..194dba2 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
@@ -306,11 +306,12 @@ static void _on_first_detach(void *link_context,
                              qdr_error_t *error)
 {
     _endpoint_ref_t *epr = (_endpoint_ref_t *)link_context;
-    qdrc_endpoint_detach_CT(_server_state.core, epr->endpoint, 0);
-    DEQ_REMOVE(_server_state.endpoints, epr);
     qd_log(_server_state.core->log, QD_LOG_TRACE,
            "Client detached from address lookup server (container=%s, endpoint=%p)",
            epr->container_id, (void *)epr->endpoint);
+
+    qdrc_endpoint_detach_CT(_server_state.core, epr->endpoint, 0);
+    DEQ_REMOVE(_server_state.endpoints, epr);
     free__endpoint_ref_t(epr);
 }
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/16674f44/src/router_core/modules/edge_router/edge_mgmt.c
----------------------------------------------------------------------
diff --git a/src/router_core/modules/edge_router/edge_mgmt.c b/src/router_core/modules/edge_router/edge_mgmt.c
index 1fc929a..7dd6245 100644
--- a/src/router_core/modules/edge_router/edge_mgmt.c
+++ b/src/router_core/modules/edge_router/edge_mgmt.c
@@ -135,7 +135,7 @@ static void _mgmt_on_state_cb_CT(qdr_core_t    *core,
                                  bool           active)
 {
     qd_log(core->log, QD_LOG_TRACE,
-           "edge mgmt client state change: uc=%"PRIuPTR" %s",
+           "edge mgmt client state change: uc=%p %s",
            user_context,
            (active) ? "active" : "down");
 
@@ -154,7 +154,7 @@ static void _mgmt_on_flow_cb_CT(qdr_core_t    *core,
                                 bool           drain)
 {
     qd_log(core->log, QD_LOG_TRACE,
-           "edge mgmt client flow: uc=%"PRIuPTR" c=%d d=%s",
+           "edge mgmt client flow: uc=%p c=%d d=%s",
            user_context, available_credit,
            (drain) ? "T" : "F");
 
@@ -174,7 +174,7 @@ static void _mgmt_on_ack_cb_CT(qdr_core_t    *core,
     qcm_edge_mgmt_request_t *req = (qcm_edge_mgmt_request_t *)request_context;
 
     qd_log(core->log, QD_LOG_TRACE,
-           "edge mgmt request update: rc=%"PRIuPTR" d=0x%"PRIx64,
+           "edge mgmt request update: rc=%p d=0x%"PRIx64,
            req->req_context, disposition);
 
     if (disposition != PN_ACCEPTED) {
@@ -209,7 +209,7 @@ static uint64_t _mgmt_on_reply_cb_CT(qdr_core_t    *core,
 
     qd_log(core->log, QD_LOG_TRACE,
            "Edge management request reply:"
-           " rc=%"PRIuPTR" status=%"PRId32": %s",
+           " rc=%p status=%"PRId32": %s",
            req->req_context, statusCode,
            (statusDescription) ? statusDescription : "<no description>");
 
@@ -233,7 +233,7 @@ static void _mgmt_on_done_cb_CT(qdr_core_t    *core,
 {
     qcm_edge_mgmt_request_t *req = (qcm_edge_mgmt_request_t *)request_context;
     qd_log(core->log, QD_LOG_TRACE,
-           "edge mgmt request done: uc=%"PRIuPTR" rc=%"PRIuPTR" %s",
+           "edge mgmt request done: uc=%p rc=%p %s",
            user_context, request_context, error ? error : "");
 
     if (error && req->error_callback)
@@ -257,7 +257,7 @@ int qcm_edge_mgmt_request_CT(qdr_core_t           *core,
 {
 
     qd_log(core->log, QD_LOG_TRACE,
-           "New Edge management request: rc=%"PRIuPTR" %s type=%s id=%s",
+           "New Edge management request: rc=%p %s type=%s id=%s",
            request_context, operation, entity_type,
            (identity) ? identity : "<unset>");
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/16674f44/src/router_core/modules/test_hooks/core_test_hooks.c
----------------------------------------------------------------------
diff --git a/src/router_core/modules/test_hooks/core_test_hooks.c b/src/router_core/modules/test_hooks/core_test_hooks.c
index ef09ee4..c3d25a3 100644
--- a/src/router_core/modules/test_hooks/core_test_hooks.c
+++ b/src/router_core/modules/test_hooks/core_test_hooks.c
@@ -491,7 +491,7 @@ static uint64_t _client_on_reply_cb(qdr_core_t    *core,
                                     qd_iterator_t *body)
 {
     qd_log(core->log, QD_LOG_TRACE,
-           "client test reply received rc=%"PRIxPTR, request_context);
+           "client test reply received rc=%p", request_context);
 
     qd_iterator_free(app_properties);
     qd_iterator_free(body);
@@ -507,7 +507,7 @@ static void _client_on_ack_cb(qdr_core_t    *core,
 {
     test_client_t *tc = (test_client_t *)user_context;
     qd_log(core->log, QD_LOG_TRACE,
-           "client test request ack rc=%"PRIxPTR" d=%"PRIu64,
+           "client test request ack rc=%p d=%"PRIu64,
            request_context, disposition);
     assert((int64_t)request_context < tc->counter);
 }
@@ -553,7 +553,7 @@ static void _do_send(test_client_t *tc)
         ++tc->counter;
         --tc->credit;
         qd_log(tc->module->core->log, QD_LOG_TRACE,
-               "client test message sent id=%d c=%d", tc->counter + 1, tc->credit);
+               "client test message sent id=%"PRIi64" c=%d", tc->counter + 1, tc->credit);
     }
 }
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/16674f44/tests/field_test.c
----------------------------------------------------------------------
diff --git a/tests/field_test.c b/tests/field_test.c
index 74fb681..98b50d4 100644
--- a/tests/field_test.c
+++ b/tests/field_test.c
@@ -56,16 +56,22 @@ static void release_buffer_chain(qd_buffer_list_t *chain)
 static char* test_view_global_dns(void *context)
 {
     qd_iterator_t *iter = qd_iterator_string("amqp://host/global/sub", ITER_VIEW_ALL);
-    if (!qd_iterator_equal(iter, (unsigned char*) "amqp://host/global/sub"))
+    if (!qd_iterator_equal(iter, (unsigned char*) "amqp://host/global/sub")) {
+        qd_iterator_free(iter);
         return "ITER_VIEW_ALL failed";
+    }
 
     qd_iterator_reset_view(iter, ITER_VIEW_ADDRESS_NO_HOST);
-    if (!qd_iterator_equal(iter, (unsigned char*) "global/sub"))
+    if (!qd_iterator_equal(iter, (unsigned char*) "global/sub")) {
+        qd_iterator_free(iter);
         return "ITER_VIEW_ADDRESS_NO_HOST failed";
+    }
 
     qd_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH);
-    if (!qd_iterator_equal(iter, (unsigned char*) "M0global/sub"))
+    if (!qd_iterator_equal(iter, (unsigned char*) "M0global/sub")) {
+        qd_iterator_free(iter);
         return "ITER_VIEW_ADDRESS_HASH failed";
+    }
 
     qd_iterator_free(iter);
 
@@ -76,16 +82,22 @@ static char* test_view_global_dns(void *context)
 static char* test_view_global_non_dns(void *context)
 {
     qd_iterator_t *iter = qd_iterator_string("amqp:/global/sub", ITER_VIEW_ALL);
-    if (!qd_iterator_equal(iter, (unsigned char*) "amqp:/global/sub"))
+    if (!qd_iterator_equal(iter, (unsigned char*) "amqp:/global/sub")) {
+        qd_iterator_free(iter);
         return "ITER_VIEW_ALL failed";
+    }
 
     qd_iterator_reset_view(iter, ITER_VIEW_ADDRESS_NO_HOST);
-    if (!qd_iterator_equal(iter, (unsigned char*) "global/sub"))
+    if (!qd_iterator_equal(iter, (unsigned char*) "global/sub")) {
+        qd_iterator_free(iter);
         return "ITER_VIEW_ADDRESS_NO_HOST failed";
+    }
 
     qd_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH);
-    if (!qd_iterator_equal(iter, (unsigned char*) "M0global/sub"))
+    if (!qd_iterator_equal(iter, (unsigned char*) "M0global/sub")) {
+        qd_iterator_free(iter);
         return "ITER_VIEW_ADDRESS_HASH failed";
+    }
 
     qd_iterator_free(iter);
 
@@ -96,16 +108,22 @@ static char* test_view_global_non_dns(void *context)
 static char* test_view_global_no_host(void *context)
 {
     qd_iterator_t *iter = qd_iterator_string("global/sub", ITER_VIEW_ALL);
-    if (!qd_iterator_equal(iter, (unsigned char*) "global/sub"))
+    if (!qd_iterator_equal(iter, (unsigned char*) "global/sub")) {
+        qd_iterator_free(iter);
         return "ITER_VIEW_ALL failed";
+    }
 
     qd_iterator_reset_view(iter, ITER_VIEW_ADDRESS_NO_HOST);
-    if (!qd_iterator_equal(iter, (unsigned char*) "global/sub"))
+    if (!qd_iterator_equal(iter, (unsigned char*) "global/sub")) {
+        qd_iterator_free(iter);
         return "ITER_VIEW_ADDRESS_NO_HOST failed";
+    }
 
     qd_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH);
-    if (!qd_iterator_equal(iter, (unsigned char*) "M0global/sub"))
+    if (!qd_iterator_equal(iter, (unsigned char*) "M0global/sub")) {
+        qd_iterator_free(iter);
         return "ITER_VIEW_ADDRESS_HASH failed";
+    }
 
     qd_iterator_free(iter);
 
@@ -116,16 +134,22 @@ static char* test_view_global_no_host(void *context)
 static char* test_view_global_no_host_slash(void *context)
 {
     qd_iterator_t *iter = qd_iterator_string("/global/sub", ITER_VIEW_ALL);
-    if (!qd_iterator_equal(iter, (unsigned char*) "/global/sub"))
+    if (!qd_iterator_equal(iter, (unsigned char*) "/global/sub")) {
+        qd_iterator_free(iter);
         return "ITER_VIEW_ALL failed";
+    }
 
     qd_iterator_reset_view(iter, ITER_VIEW_ADDRESS_NO_HOST);
-    if (!qd_iterator_equal(iter, (unsigned char*) "global/sub"))
+    if (!qd_iterator_equal(iter, (unsigned char*) "global/sub")) {
+        qd_iterator_free(iter);
         return "ITER_VIEW_ADDRESS_NO_HOST failed";
+    }
 
     qd_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH);
-    if (!qd_iterator_equal(iter, (unsigned char*) "M0global/sub"))
+    if (!qd_iterator_equal(iter, (unsigned char*) "M0global/sub")) {
+        qd_iterator_free(iter);
         return "ITER_VIEW_ADDRESS_HASH failed";
+    }
 
     qd_iterator_free(iter);
 
@@ -545,6 +569,7 @@ static char *field_advance_test(void *context,
             snprintf(fail_text, FAIL_TEXT_SIZE,
                      "Field advance failed.  Expected '%s'",
                      (char *)template );
+            qd_iterator_free(raw);
             return fail_text;
         }
         qd_iterator_advance(iter, increment);
@@ -601,8 +626,11 @@ static char *test_qd_hash_retrieve_prefix_separator(void *context)
     qd_error_t error = qd_hash_insert(hash, iter, "TEST", 0);
 
     // There should be no error on the insert hash
-    if (error != QD_ERROR_NONE)
+    if (error != QD_ERROR_NONE) {
+        qd_iterator_free(iter);
+        qd_hash_free(hash);
         return "qd_hash_insert failed";
+    }
 
     const char *taddr = "policy.org.apache.dev";
 
@@ -635,8 +663,11 @@ static char *test_qd_hash_retrieve_prefix(void *context)
     qd_error_t error = qd_hash_insert(hash, iter, "TEST", 0);
 
     // There should be no error on the insert hash
-    if (error != QD_ERROR_NONE)
+    if (error != QD_ERROR_NONE) {
+        qd_iterator_free(iter);
+        qd_hash_free(hash);
         return "qd_hash_insert failed";
+    }
 
     const char *taddr = "policy.org.apache.dev";
 
@@ -670,8 +701,11 @@ static char *test_qd_hash_retrieve_prefix_no_match(void *context)
     qd_error_t error = qd_hash_insert(hash, iter, "TEST", 0);
 
     // There should be no error on the insert hash
-    if (error != QD_ERROR_NONE)
+    if (error != QD_ERROR_NONE) {
+        qd_iterator_free(iter);
+        qd_hash_free(hash);
         return "qd_hash_insert failed";
+    }
 
     const char *taddr = "policy.org.apache.dev";
 
@@ -705,8 +739,11 @@ static char *test_qd_hash_retrieve_prefix_no_match_separator(void *context)
     qd_error_t error = qd_hash_insert(hash, iter, "TEST", 0);
 
     // There should be no error on the insert hash
-    if (error != QD_ERROR_NONE)
+    if (error != QD_ERROR_NONE) {
+        qd_iterator_free(iter);
+        qd_hash_free(hash);
         return "qd_hash_insert failed";
+    }
 
     const char *taddr = "policy.org.apache.dev";
 
@@ -737,8 +774,11 @@ static char *test_qd_hash_retrieve_prefix_separator_exact_match(void *context)
     qd_error_t error = qd_hash_insert(hash, iter, "TEST", 0);
 
     // There should be no error on the insert hash
-    if (error != QD_ERROR_NONE)
+    if (error != QD_ERROR_NONE) {
+        qd_iterator_free(iter);
+        qd_hash_free(hash);
         return "qd_hash_insert failed";
+    }
 
     const char *taddr = "policy";
 
@@ -769,8 +809,11 @@ static char *test_qd_hash_retrieve_prefix_separator_exact_match_1(void *context)
     qd_error_t error = qd_hash_insert(hash, iter, "TEST", 0);
 
     // There should be no error on the insert hash
-    if (error != QD_ERROR_NONE)
+    if (error != QD_ERROR_NONE) {
+        qd_iterator_free(iter);
+        qd_hash_free(hash);
         return "qd_hash_insert failed";
+    }
 
     const char *taddr = "policy.apache.org";
 
@@ -804,8 +847,11 @@ static char *test_qd_hash_retrieve_prefix_separator_exact_match_slashes(void *co
     qd_error_t error = qd_hash_insert(hash, iter, "TEST", 0);
 
     // There should be no error on the insert hash
-    if (error != QD_ERROR_NONE)
+    if (error != QD_ERROR_NONE) {
+        qd_iterator_free(iter);
+        qd_hash_free(hash);
         return "qd_hash_insert failed";
+    }
 
     const char *taddr = "policy/apache/org";
 
@@ -837,8 +883,11 @@ static char *test_qd_hash_retrieve_prefix_separator_exact_match_dot_at_end(void
     qd_error_t error = qd_hash_insert(hash, iter, "TEST", 0);
 
     // There should be no error on the insert hash
-    if (error != QD_ERROR_NONE)
+    if (error != QD_ERROR_NONE) {
+        qd_iterator_free(iter);
+        qd_hash_free(hash);
         return "qd_hash_insert failed";
+    }
 
     const char *taddr = "policy.";
 
@@ -870,8 +919,11 @@ static char *test_qd_hash_retrieve_prefix_separator_exact_match_dot_at_end_1(voi
     qd_error_t error = qd_hash_insert(hash, iter, "TEST", 0);
 
     // There should be no error on the insert hash
-    if (error != QD_ERROR_NONE)
+    if (error != QD_ERROR_NONE) {
+        qd_iterator_free(iter);
+        qd_hash_free(hash);
         return "qd_hash_insert failed";
+    }
 
     const char *taddr = "policy.apache.";
 
@@ -955,6 +1007,7 @@ static char *test_prefix_hash(void *context)
             snprintf(error, 200, "Pattern: '%s', expected %d, got %d",
                      patterns[idx].pattern, patterns[idx].entry, position);
             qd_iterator_free(iter);
+            qd_hash_free(hash);
             return error;
         }
         qd_iterator_free(iter);
@@ -1029,6 +1082,7 @@ static char *test_prefix_hash_with_space(void *context)
             snprintf(error, 200, "Pattern: '%s', expected %d, got %d",
                      patterns[idx].pattern, patterns[idx].entry, position);
             qd_iterator_free(iter);
+            qd_hash_free(hash);
             return error;
         }
         qd_iterator_free(iter);

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/16674f44/tests/message_test.c
----------------------------------------------------------------------
diff --git a/tests/message_test.c b/tests/message_test.c
index 90766f7..141e6c1 100644
--- a/tests/message_test.c
+++ b/tests/message_test.c
@@ -102,7 +102,10 @@ static char* test_receive_from_messenger(void *context)
 
     size_t       size = 10000;
     int result = pn_message_encode(pn_msg, buffer, &size);
-    if (result != 0) return "Error in pn_message_encode";
+    if (result != 0) {
+        pn_message_free(pn_msg);
+        return "Error in pn_message_encode";
+    }
 
     qd_message_t         *msg     = qd_message();
     qd_message_content_t *content = MSG_CONTENT(msg);
@@ -110,26 +113,42 @@ static char* test_receive_from_messenger(void *context)
     set_content(content, size);
 
     int valid = qd_message_check(msg, QD_DEPTH_ALL);
-    if (!valid) return "qd_message_check returns 'invalid'";
+    if (!valid) {
+        pn_message_free(pn_msg);
+        qd_message_free(msg);
+        return "qd_message_check returns 'invalid'";
+    }
 
     qd_iterator_t *iter = qd_message_field_iterator(msg, QD_FIELD_TO);
-    if (iter == 0) return "Expected an iterator for the 'to' field";
+    if (iter == 0) {
+        pn_message_free(pn_msg);
+        qd_message_free(msg);
+        return "Expected an iterator for the 'to' field";
+    }
 
     if (!qd_iterator_equal(iter, (unsigned char*) "test_addr_1")) {
         qd_iterator_free(iter);
+        pn_message_free(pn_msg);
+        qd_message_free(msg);
         return "Mismatched 'to' field contents";
     }
     qd_iterator_free(iter);
 
     ssize_t  test_len = (size_t)qd_message_field_length(msg, QD_FIELD_TO);
-    if (test_len != 11)
+    if (test_len != 11) {
+        pn_message_free(pn_msg);
+        qd_message_free(msg);
         return "Incorrect field length";
+    }
 
     char test_field[100];
     size_t hdr_length;
     test_len = qd_message_field_copy(msg, QD_FIELD_TO, test_field, &hdr_length);
-    if (test_len - hdr_length != 11)
+    if (test_len - hdr_length != 11) {
+        pn_message_free(pn_msg);
+        qd_message_free(msg);
         return "Incorrect length returned from field_copy";
+    }
 
     if (test_len < 0) {
         pn_message_free(pn_msg);
@@ -178,35 +197,47 @@ static char* test_message_properties(void *context)
 
     qd_iterator_t *iter = qd_message_field_iterator(msg, QD_FIELD_CORRELATION_ID);
     if (!iter) {
+        qd_message_free(msg);
         return "Expected iterator for the 'correlation-id' field";
     }
     if (qd_iterator_length(iter) != 13) {
         qd_iterator_free(iter);
+        qd_message_free(msg);
         return "Bad length for correlation-id";
     }
     if (!qd_iterator_equal(iter, (const unsigned char *)"correlationId")) {
         qd_iterator_free(iter);
+        qd_message_free(msg);
         return "Invalid correlation-id";
     }
     qd_iterator_free(iter);
 
     iter = qd_message_field_iterator(msg, QD_FIELD_SUBJECT);
-    if (!iter) return "Expected iterator for the 'subject' field";
+    if (!iter) {
+        qd_iterator_free(iter);
+        qd_message_free(msg);
+        return "Expected iterator for the 'subject' field";
+    }
     if (!qd_iterator_equal(iter, (const unsigned char *)subject)) {
         qd_iterator_free(iter);
+        qd_message_free(msg);
         return "Bad value for subject";
     }
     qd_iterator_free(iter);
 
     iter = qd_message_field_iterator(msg, QD_FIELD_MESSAGE_ID);
-    if (!iter)
+    if (!iter) {
+        qd_message_free(msg);
         return "Expected iterator for the 'message-id' field";
+    }
     if (qd_iterator_length(iter) != 9) {
         qd_iterator_free(iter);
+        qd_message_free(msg);
         return "Bad length for message-id";
     }
     if (!qd_iterator_equal(iter, (const unsigned char *)"messageId")) {
         qd_iterator_free(iter);
+        qd_message_free(msg);
         return "Invalid message-id";
     }
     qd_iterator_free(iter);
@@ -214,6 +245,7 @@ static char* test_message_properties(void *context)
     iter = qd_message_field_iterator(msg, QD_FIELD_TO);
     if (iter) {
         qd_iterator_free(iter);
+        qd_message_free(msg);
         return "Expected no iterator for the 'to' field";
     }
     qd_iterator_free(iter);
@@ -240,13 +272,22 @@ static char* test_check_multiple(void *context)
     set_content(content, size);
 
     int valid = qd_message_check(msg, QD_DEPTH_DELIVERY_ANNOTATIONS);
-    if (!valid) return "qd_message_check returns 'invalid' for DELIVERY_ANNOTATIONS";
+    if (!valid) {
+        qd_message_free(msg);
+        return "qd_message_check returns 'invalid' for DELIVERY_ANNOTATIONS";
+    }
 
     valid = qd_message_check(msg, QD_DEPTH_BODY);
-    if (!valid) return "qd_message_check returns 'invalid' for BODY";
+    if (!valid) {
+        qd_message_free(msg);
+        return "qd_message_check returns 'invalid' for BODY";
+    }
 
     valid = qd_message_check(msg, QD_DEPTH_PROPERTIES);
-    if (!valid) return "qd_message_check returns 'invalid' for PROPERTIES";
+    if (!valid) {
+        qd_message_free(msg);
+        return "qd_message_check returns 'invalid' for PROPERTIES";
+    }
 
     qd_message_free(msg);
 
@@ -340,10 +381,14 @@ static char* test_q2_input_holdoff_sensing(void *context)
         qd_message_content_t *content = MSG_CONTENT(msg);
 
         set_content_bufs(content, nbufs);
-        if (qd_message_Q2_holdoff_should_block(msg) != (nbufs >= QD_QLIMIT_Q2_UPPER))
+        if (qd_message_Q2_holdoff_should_block(msg) != (nbufs >= QD_QLIMIT_Q2_UPPER)) {
+            qd_message_free(msg);
             return "qd_message_holdoff_would_block was miscalculated";
-        if (qd_message_Q2_holdoff_should_unblock(msg) != (nbufs < QD_QLIMIT_Q2_LOWER))
+        }
+        if (qd_message_Q2_holdoff_should_unblock(msg) != (nbufs < QD_QLIMIT_Q2_LOWER)) {
+            qd_message_free(msg);
             return "qd_message_holdoff_would_unblock was miscalculated";
+        }
 
         qd_message_free(msg);
     }

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/16674f44/tests/parse_test.c
----------------------------------------------------------------------
diff --git a/tests/parse_test.c b/tests/parse_test.c
index ac678f5..8d48c76 100644
--- a/tests/parse_test.c
+++ b/tests/parse_test.c
@@ -74,57 +74,69 @@ struct fs_vector_t {
 static char *test_parser_fixed_scalars(void *context)
 {
     int idx = 0;
+    qd_iterator_t *field = NULL;
+    qd_parsed_field_t *parsed = NULL;
     static char error[1024];
 
+    error[0] = 0;
+
     while (fs_vectors[idx].data) {
-        qd_iterator_t *field  = qd_iterator_binary(fs_vectors[idx].data,
-                                                   fs_vectors[idx].length, ITER_VIEW_ALL);
-        qd_parsed_field_t *parsed = qd_parse(field);
+        field = qd_iterator_binary(fs_vectors[idx].data,
+                                   fs_vectors[idx].length, ITER_VIEW_ALL);
+        parsed = qd_parse(field);
 
         qd_iterator_t *typed_iter = qd_parse_typed(parsed);
 
         int length = qd_iterator_length(typed_iter);
 
-        if (length != fs_vectors[idx].length)
-            return "Length of typed iterator does not match actual length";
+        if (length != fs_vectors[idx].length) {
+            strcpy(error, "Length of typed iterator does not match actual length");
+            break;
+        }
 
-        if (!qd_parse_ok(parsed)) return "Unexpected Parse Error";
+        if (!qd_parse_ok(parsed)) {
+            strcpy(error, "Unexpected Parse Error");
+            break;
+        }
         if (qd_parse_tag(parsed) != fs_vectors[idx].expected_tag) {
             sprintf(error, "(%d) Tag: Expected %02x, Got %02x", idx,
                     fs_vectors[idx].expected_tag, qd_parse_tag(parsed));
-            return error;
+            break;
         }
         if (fs_vectors[idx].check_uint &&
             qd_parse_as_uint(parsed) != fs_vectors[idx].expected_ulong) {
             sprintf(error, "(%d) UINT: Expected %"PRIx64", Got %"PRIx32, idx,
                     fs_vectors[idx].expected_ulong, qd_parse_as_uint(parsed));
-            return error;
+            break;
         }
         if (fs_vectors[idx].check_ulong &&
             qd_parse_as_ulong(parsed) != fs_vectors[idx].expected_ulong) {
             sprintf(error, "(%d) ULONG: Expected %"PRIx64", Got %"PRIx64, idx,
                     fs_vectors[idx].expected_ulong, qd_parse_as_ulong(parsed));
-            return error;
+            break;
         }
         if (fs_vectors[idx].check_int &&
             qd_parse_as_int(parsed) != fs_vectors[idx].expected_long) {
             sprintf(error, "(%d) INT: Expected %"PRIx64", Got %"PRIx32, idx,
                     fs_vectors[idx].expected_long, qd_parse_as_int(parsed));
-            return error;
+            break;
         }
         if (fs_vectors[idx].check_long &&
             qd_parse_as_long(parsed) != fs_vectors[idx].expected_long) {
             sprintf(error, "(%d) LONG: Expected %"PRIx64", Got %"PRIx64, idx,
                     fs_vectors[idx].expected_long, qd_parse_as_long(parsed));
-            return error;
+            break;
         }
         idx++;
-
         qd_iterator_free(field);
+        field = 0;
         qd_parse_free(parsed);
+        parsed = 0;
     }
 
-    return 0;
+    qd_iterator_free(field);
+    qd_parse_free(parsed);
+    return *error ? error : 0;
 }
 
 static char *test_integer_conversion(void *context)
@@ -370,10 +382,14 @@ static char *test_parser_errors(void *context)
                                                    err_vectors[idx].length, ITER_VIEW_ALL);
         qd_parsed_field_t *parsed = qd_parse(field);
         if (qd_parse_ok(parsed)) {
+            qd_parse_free(parsed);
+            qd_iterator_free(field);
             sprintf(error, "(%d) Unexpected Parse Success", idx);
             return error;
         }
         if (strcmp(qd_parse_error(parsed), err_vectors[idx].expected_error) != 0) {
+            qd_parse_free(parsed);
+            qd_iterator_free(field);
             sprintf(error, "(%d) Error: Expected %s, Got %s", idx,
                     err_vectors[idx].expected_error, qd_parse_error(parsed));
             return error;
@@ -394,6 +410,7 @@ static char *test_tracemask(void *context)
     qd_buffer_list_t list;
     static char      error[1024];
 
+    error[0] = 0;
     qd_iterator_set_address(false, "0", "ROUTER");
 
     qd_tracemask_add_router(tm, "amqp:/_topo/0/Router.A", 0);
@@ -435,11 +452,11 @@ static char *test_tracemask(void *context)
     bm = qd_tracemask_create(tm, pf, &ingress);
     if (qd_bitmask_cardinality(bm) != 3) {
         sprintf(error, "Expected cardinality of 3, got %d", qd_bitmask_cardinality(bm));
-        return error;
+        goto cleanup;
     }
     if (ingress != 0) {
         sprintf(error, "(A) Expected ingress index of 0, got %d", ingress);
-        return error;
+        goto cleanup;
     }
     int total = 0;
     int bit, c;
@@ -448,23 +465,25 @@ static char *test_tracemask(void *context)
     }
     if (total != 17) {
         sprintf(error, "Expected total bit value of 17, got %d", total);
-        return error;
+        goto cleanup;
     }
 
     qd_bitmask_free(bm);
+    bm = 0;
     qd_tracemask_del_router(tm, 3);
     qd_tracemask_remove_link(tm, 0);
 
     ingress = -1;
     bm = qd_tracemask_create(tm, pf, &ingress);
     qd_parse_free(pf);
+    pf = 0;
     if (qd_bitmask_cardinality(bm) != 1) {
         sprintf(error, "Expected cardinality of 1, got %d", qd_bitmask_cardinality(bm));
-        return error;
+        goto cleanup;
     }
     if (ingress != 0) {
         sprintf(error, "(B) Expected ingress index of 0, got %d", ingress);
-        return error;
+        goto cleanup;
     }
 
     total = 0;
@@ -473,16 +492,18 @@ static char *test_tracemask(void *context)
     }
     if (total != 3) {
         sprintf(error, "Expected total bit value of 3, got %d", total);
-        return error;
+        // fallthrough
     }
 
+cleanup:
+    qd_parse_free(pf);
     qd_tracemask_free(tm);
     qd_bitmask_free(bm);
     for (qd_buffer_t *buf = DEQ_HEAD(list); buf; buf = DEQ_HEAD(list)) {
         DEQ_REMOVE_HEAD(list);
         qd_buffer_free(buf);
     }
-    return 0;
+    return *error ? error : 0;
 }
 
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/16674f44/tests/parse_tree_tests.c
----------------------------------------------------------------------
diff --git a/tests/parse_tree_tests.c b/tests/parse_tree_tests.c
index 1dba5ba..47b5fac 100644
--- a/tests/parse_tree_tests.c
+++ b/tests/parse_tree_tests.c
@@ -30,35 +30,75 @@ static char *test_add_remove(void *context)
     qd_parse_tree_t *node = qd_parse_tree_new(QD_PARSE_TREE_ADDRESS);
     void *payload;
 
-    if (qd_parse_tree_remove_pattern(node, piter))
+    if (qd_parse_tree_remove_pattern(node, piter)) {
+        qd_parse_tree_free(node);
+        qd_iterator_free(piter);
+        qd_iterator_free(piter2);
         return "Failed to remove a non-existing pattern";
+    }
 
-    if (qd_parse_tree_get_pattern(node, piter, &payload))
+    if (qd_parse_tree_get_pattern(node, piter, &payload)) {
+        qd_parse_tree_free(node);
+        qd_iterator_free(piter);
+        qd_iterator_free(piter2);
         return "Got a non-existing pattern";
+    }
 
-    if (qd_parse_tree_add_pattern(node, piter, "Hi Sam"))
+    if (qd_parse_tree_add_pattern(node, piter, "Hi Sam")) {
+        qd_parse_tree_free(node);
+        qd_iterator_free(piter);
+        qd_iterator_free(piter2);
         return "Add returned existing value";
+    }
 
-    if (qd_parse_tree_add_pattern(node, piter2, "Bye Sam"))
+    if (qd_parse_tree_add_pattern(node, piter2, "Bye Sam")) {
+        qd_parse_tree_free(node);
+        qd_iterator_free(piter);
+        qd_iterator_free(piter2);
         return "Add returned existing value";
+    }
 
-    if (!qd_parse_tree_get_pattern(node, piter, &payload))
+    if (!qd_parse_tree_get_pattern(node, piter, &payload)) {
+        qd_parse_tree_free(node);
+        qd_iterator_free(piter);
+        qd_iterator_free(piter2);
         return "Could not get pattern";
+    }
 
-    if (!payload || strcmp("Hi Sam", (char *)payload))
+    if (!payload || strcmp("Hi Sam", (char *)payload)) {
+        qd_parse_tree_free(node);
+        qd_iterator_free(piter);
+        qd_iterator_free(piter2);
         return "Got bad pattern";
+    }
 
-    if (!qd_parse_tree_get_pattern(node, piter2, &payload))
+    if (!qd_parse_tree_get_pattern(node, piter2, &payload)) {
+        qd_parse_tree_free(node);
+        qd_iterator_free(piter);
+        qd_iterator_free(piter2);
         return "Could not get pattern";
+    }
 
-    if (!payload || strcmp("Bye Sam", (char *)payload))
+    if (!payload || strcmp("Bye Sam", (char *)payload)) {
+        qd_parse_tree_free(node);
+        qd_iterator_free(piter);
+        qd_iterator_free(piter2);
         return "Got bad pattern";
+    }
 
-    if (!qd_parse_tree_remove_pattern(node, piter))
+    if (!qd_parse_tree_remove_pattern(node, piter)) {
+        qd_parse_tree_free(node);
+        qd_iterator_free(piter);
+        qd_iterator_free(piter2);
         return "Failed to remove an existing pattern";
+    }
 
-    if (!qd_parse_tree_remove_pattern(node, piter2))
+    if (!qd_parse_tree_remove_pattern(node, piter2)) {
+        qd_parse_tree_free(node);
+        qd_iterator_free(piter);
+        qd_iterator_free(piter2);
         return "Failed to remove an existing pattern";
+    }
 
     qd_parse_tree_free(node);
     qd_iterator_free(piter);
@@ -73,26 +113,40 @@ static char *test_add_and_match_str(void *context)
     qd_parse_tree_t *node = qd_parse_tree_new(QD_PARSE_TREE_ADDRESS);
     void *payload;
 
-    if (qd_parse_tree_add_pattern_str(node, str1, "Hi Sam"))
+    if (qd_parse_tree_add_pattern_str(node, str1, "Hi Sam")) {
+        qd_parse_tree_free(node);
         return "Add returned existing value (1)";
+    }
 
-    if (qd_parse_tree_add_pattern_str(node, str2, "Bye Sam"))
+    if (qd_parse_tree_add_pattern_str(node, str2, "Bye Sam")) {
+        qd_parse_tree_free(node);
         return "Add returned existing value (2)";
+    }
 
-    if (!qd_parse_tree_retrieve_match_str(node, str1, &payload))
+    if (!qd_parse_tree_retrieve_match_str(node, str1, &payload)) {
+        qd_parse_tree_free(node);
         return "Failed to get expected match (1)";
+    }
 
-    if (!qd_parse_tree_retrieve_match_str(node, str2, &payload))
+    if (!qd_parse_tree_retrieve_match_str(node, str2, &payload)) {
+        qd_parse_tree_free(node);
         return "Failed to get expected match (2)";
+    }
 
-    if (qd_parse_tree_retrieve_match_str(node, "notSoFast", &payload))
+    if (qd_parse_tree_retrieve_match_str(node, "notSoFast", &payload)) {
+        qd_parse_tree_free(node);
         return "Match pattern should not match but did match";
+    }
 
-    if (!qd_parse_tree_remove_pattern_str(node, str1))
+    if (!qd_parse_tree_remove_pattern_str(node, str1)) {
+        qd_parse_tree_free(node);
         return "Failed to remove an existing pattern str";
+    }
 
-    if (qd_parse_tree_retrieve_match_str(node, str1, &payload))
+    if (qd_parse_tree_retrieve_match_str(node, str1, &payload)) {
+        qd_parse_tree_free(node);
         return "Removed pattern should not match but did match";
+    }
 
     qd_parse_tree_free(node);
     return NULL;
@@ -108,57 +162,87 @@ static char *test_usurpation_recovery_str(void *context)
     void *deposed;
 
     // rightful owner is ensconsced
-    if (qd_parse_tree_add_pattern_str(node, A, (void *)A))
+    if (qd_parse_tree_add_pattern_str(node, A, (void *)A)) {
+        qd_parse_tree_free(node);
         return "Add returned existing value (1)";
+    }
 
     // matches on A or B both return A
-    if (!qd_parse_tree_retrieve_match_str(node, A, &payload))
+    if (!qd_parse_tree_retrieve_match_str(node, A, &payload)) {
+        qd_parse_tree_free(node);
         return "Could not get pattern";
+    }
 
-    if (!payload || strcmp(A, (char *)payload))
+    if (!payload || strcmp(A, (char *)payload)) {
+        qd_parse_tree_free(node);
         return "Got bad pattern";
+    }
 
-    if (!qd_parse_tree_retrieve_match_str(node, B, &payload))
+    if (!qd_parse_tree_retrieve_match_str(node, B, &payload)) {
+        qd_parse_tree_free(node);
         return "Could not get pattern";
+    }
 
-    if (!payload || strcmp(A, (char *)payload))
+    if (!payload || strcmp(A, (char *)payload)) {
+        qd_parse_tree_free(node);
         return "Got bad pattern";
+    }
 
     // usurper comes along
     usurped = qd_parse_tree_add_pattern_str(node, B, (void *)B);
-    if (!usurped || strcmp(A, (char *)usurped))
+    if (!usurped || strcmp(A, (char *)usurped)) {
+        qd_parse_tree_free(node);
         return "Usurper should have grabbed '#' optimized match";
+    }
 
     // matches on A or B both return B
-    if (!qd_parse_tree_retrieve_match_str(node, A, &payload))
+    if (!qd_parse_tree_retrieve_match_str(node, A, &payload)) {
+        qd_parse_tree_free(node);
         return "Could not get pattern";
+    }
 
-    if (!payload || strcmp(B, (char *)payload))
+    if (!payload || strcmp(B, (char *)payload)) {
+        qd_parse_tree_free(node);
         return "Got bad pattern";
+    }
 
-    if (!qd_parse_tree_retrieve_match_str(node, B, &payload))
+    if (!qd_parse_tree_retrieve_match_str(node, B, &payload)) {
+        qd_parse_tree_free(node);
         return "Could not get pattern";
+    }
 
-    if (!payload || strcmp(B, (char *)payload))
+    if (!payload || strcmp(B, (char *)payload)) {
+        qd_parse_tree_free(node);
         return "Got bad pattern";
+    }
 
     // Restore rightful owner
     deposed = qd_parse_tree_add_pattern_str(node, usurped, usurped);
-    if (!deposed || strcmp(B, (char *)deposed))
+    if (!deposed || strcmp(B, (char *)deposed)) {
+        qd_parse_tree_free(node);
         return "Failed to depose B";
+    }
 
     // matches on A or B both return A
-    if (!qd_parse_tree_retrieve_match_str(node, A, &payload))
+    if (!qd_parse_tree_retrieve_match_str(node, A, &payload)) {
+        qd_parse_tree_free(node);
         return "Could not get pattern";
+    }
 
-    if (!payload || strcmp(A, (char *)payload))
+    if (!payload || strcmp(A, (char *)payload)) {
+        qd_parse_tree_free(node);
         return "Got bad pattern";
+    }
 
-    if (!qd_parse_tree_retrieve_match_str(node, B, &payload))
+    if (!qd_parse_tree_retrieve_match_str(node, B, &payload)) {
+        qd_parse_tree_free(node);
         return "Could not get pattern";
+    }
 
-    if (!payload || strcmp(A, (char *)payload))
+    if (!payload || strcmp(A, (char *)payload)) {
+        qd_parse_tree_free(node);
         return "Got bad pattern";
+    }
 
     qd_parse_tree_free(node);
     return NULL;
@@ -209,26 +293,46 @@ static char *check_normalize(const char *input,
     qd_iterator_t *iter = qd_iterator_string(input, ITER_VIEW_ALL);
     void *payload;
 
-    if (qd_parse_tree_add_pattern(node, iter, (void *)input) != NULL)
+    if (qd_parse_tree_add_pattern(node, iter, (void *)input) != NULL) {
+        qd_parse_tree_free(node);
+        qd_iterator_free(iter);
         return "Unexpected duplicate pattern";
-    if (!qd_parse_tree_get_pattern(node, iter, &payload))
+    }
+    if (!qd_parse_tree_get_pattern(node, iter, &payload)) {
+        qd_parse_tree_free(node);
+        qd_iterator_free(iter);
         return "Could not find added pattern";
-    if (!payload || strcmp((const char *)payload, input))
+    }
+    if (!payload || strcmp((const char *)payload, input)) {
+        qd_parse_tree_free(node);
+        qd_iterator_free(iter);
         return "Failed to find pattern";
+    }
 
     qd_parse_tree_walk(node, visit_all, &vh);
-    if (vh.count != 1)
+    if (vh.count != 1) {
+        qd_parse_tree_free(node);
+        qd_iterator_free(iter);
         return "Did not find expected pattern";
-    if (strcmp(vh.payloads[0], input))
+    }
+    if (strcmp(vh.payloads[0], input)) {
+        qd_parse_tree_free(node);
+        qd_iterator_free(iter);
         return "Unexpected payload!";
+    }
     if (strcmp(vh.patterns[0], expected)) {
         fprintf(stderr, "%s %s\n", vh.patterns[0], expected);
+        qd_parse_tree_free(node);
+        qd_iterator_free(iter);
         return "Incorrect normalization";
     }
 
     payload = qd_parse_tree_remove_pattern(node, iter);
-    if (!payload || strcmp((const char *)payload, input))
+    if (!payload || strcmp((const char *)payload, input)) {
+        qd_parse_tree_free(node);
+        qd_iterator_free(iter);
         return "Failed to remove pattern";
+    }
 
     qd_parse_tree_free(node);
     qd_iterator_free(iter);
@@ -274,8 +378,11 @@ static char *match_test(qd_parse_tree_type_t type,
     qd_parse_tree_t *node = qd_parse_tree_new(type);
     void *payload = (void *)"found";
 
-    if (qd_parse_tree_add_pattern(node, piter, payload))
+    if (qd_parse_tree_add_pattern(node, piter, payload)) {
+        qd_parse_tree_free(node);
+        qd_iterator_free(piter);
         return "Unexpected payload when adding pattern";
+    }
 
     for (int i = 0; tests[i].address && !rc; i++) {
         qd_iterator_t *iter = qd_iterator_string(tests[i].address, ITER_VIEW_ALL);
@@ -283,6 +390,9 @@ static char *match_test(qd_parse_tree_type_t type,
         if (match != tests[i].match) {
             printf("match address '%s' to pattern '%s': expected %d got %d\n",
                    tests[i].address, pattern, (int)tests[i].match, (int)match);
+            qd_iterator_free(iter);
+            qd_parse_tree_free(node);
+            qd_iterator_free(piter);
             return "Match test failed";
         }
         qd_iterator_free(iter);
@@ -509,6 +619,8 @@ static char *multiple_matches(qd_parse_tree_type_t type,
         qd_iterator_t *pattern = qd_iterator_string(patterns[i], ITER_VIEW_ALL);
         if (qd_parse_tree_add_pattern(node, pattern, (void *)patterns[i])) {
             printf("Failed to add pattern %s to parse tree\n", patterns[i]);
+            qd_iterator_free(pattern);
+            qd_parse_tree_free(node);
             return "failed adding pattern to tree";
         }
         qd_iterator_free(pattern);
@@ -517,16 +629,20 @@ static char *multiple_matches(qd_parse_tree_type_t type,
     {
         // read all patterns and verify all are present
         qd_parse_tree_walk(node, visit_all, &vh);
-        if (vh.count != PCOUNT)
+        if (vh.count != PCOUNT) {
+            qd_parse_tree_free(node);
             return "Not all patterns in tree";
+        }
         for (int i = 0; i < PCOUNT; i++) {
             bool found = false;
             for (int j = 0; j < PCOUNT; j++) {
                 if (strcmp(patterns[i], vh.patterns[j]) == 0)
                     found = true;
             }
-            if (!found)
+            if (!found) {
+                qd_parse_tree_free(node);
                 return "All patterns not visited";
+            }
         }
     }
 
@@ -539,12 +655,19 @@ static char *multiple_matches(qd_parse_tree_type_t type,
         //for (int i = 0; i < vh.count; i++)
         //  printf("%s, ", vh.patterns[i]);
         //printf("count = %d\n", vh.count);
-        if (vh.count != tests[k].count)
+        if (vh.count != tests[k].count) {
+            qd_iterator_free(find_me);
+            qd_parse_tree_free(node);
             return "Unexpected match count";
+        }
         for (int i = 0; i < tests[k].count; i++) {
-            if (strcmp(vh.patterns[i], tests[k].matches[i]))
+            if (strcmp(vh.patterns[i], tests[k].matches[i])) {
+                qd_iterator_free(find_me);
+                qd_parse_tree_free(node);
                 return "Unexpected pattern match";
+            }
         }
+
         qd_iterator_free(find_me);
     }
 
@@ -556,10 +679,15 @@ static char *multiple_matches(qd_parse_tree_type_t type,
         // printf("best match for %s: %s\n", tests[k].address, vh.patterns[0]);
         if (tests[k].count == 0) {
             if (vh.count != 0) {
+                qd_iterator_free(find_me);
+                qd_parse_tree_free(node);
                 return "Did not expect to find a best match!";
             }
-        } else if (vh.count == 0 || strcmp(vh.patterns[0], tests[k].matches[0]))
-                return "Unexpected best pattern match";
+        } else if (vh.count == 0 || strcmp(vh.patterns[0], tests[k].matches[0])) {
+            qd_iterator_free(find_me);
+            qd_parse_tree_free(node);
+            return "Unexpected best pattern match";
+        }
         qd_iterator_free(find_me);
     }
 
@@ -657,38 +785,46 @@ static char *test_multiple_matches(void *context)
 static char *test_validation(void *context)
 {
     qd_iterator_t *iter = qd_iterator_string("sam.*.am.#", ITER_VIEW_ALL);
+    qd_iterator_t *iter_good = qd_iterator_string("sam/+/a.#.m/#", ITER_VIEW_ALL);
+    qd_iterator_t *iter_bad = qd_iterator_string("sam/#/am/+", ITER_VIEW_ALL);
+    qd_iterator_t *iter_const = qd_iterator_string("sam/I/am", ITER_VIEW_ALL);
     qd_parse_tree_t *mqtt_tree = qd_parse_tree_new(QD_PARSE_TREE_MQTT);
     qd_parse_tree_t *addr_tree = qd_parse_tree_new(QD_PARSE_TREE_ADDRESS);
     qd_parse_tree_t *amqp_tree = qd_parse_tree_new(QD_PARSE_TREE_AMQP_0_10);
 
+    char *error = 0;
+
     if (!qd_parse_tree_validate_pattern(addr_tree, iter) ||
         !qd_parse_tree_validate_pattern(amqp_tree, iter)) {
-        return "expected to skip validation";
+        error = "expected to skip validation";
+        goto cleanup;
     }
-    qd_iterator_free(iter);
 
-    qd_iterator_t *iter_good = qd_iterator_string("sam/+/a.#.m/#", ITER_VIEW_ALL);
     if (!qd_parse_tree_validate_pattern(mqtt_tree, iter_good)) {
-        return "expected to pass mqtt validation";
+        error = "expected to pass mqtt validation";
+        goto cleanup;
     }
-    qd_iterator_free(iter_good);
 
-    qd_iterator_t *iter_bad = qd_iterator_string("sam/#/am/+", ITER_VIEW_ALL);
     if (qd_parse_tree_validate_pattern(mqtt_tree, iter_bad)) {
-        return "expected to fail mqtt validation";
+        error = "expected to fail mqtt validation";
+        goto cleanup;
     }
-    qd_iterator_free(iter_bad);
 
-    qd_iterator_t *iter_const = qd_iterator_string("sam/I/am", ITER_VIEW_ALL);
     if (!qd_parse_tree_validate_pattern(mqtt_tree, iter_const)) {
-        return "expected to pass mqtt constant string validation";
+        error = "expected to pass mqtt constant string validation";
+        // fallthrough
     }
+
+cleanup:
+    qd_iterator_free(iter);
+    qd_iterator_free(iter_good);
+    qd_iterator_free(iter_bad);
     qd_iterator_free(iter_const);
 
     qd_parse_tree_free(mqtt_tree);
     qd_parse_tree_free(addr_tree);
     qd_parse_tree_free(amqp_tree);
-    return NULL;
+    return error ? error : 0;
 }
 
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/16674f44/tests/policy_test.c
----------------------------------------------------------------------
diff --git a/tests/policy_test.c b/tests/policy_test.c
index 3dbd478..23b26c8 100644
--- a/tests/policy_test.c
+++ b/tests/policy_test.c
@@ -97,40 +97,64 @@ static char *test_link_name_tree_lookup(void *context)
 
     qd_parse_tree_add_pattern_str(node, "${user}.xyz", payload);
 
-    if (!_qd_policy_approve_link_name_tree("chuck", "p,,.xyz", "chuck.xyz", node))
+    if (!_qd_policy_approve_link_name_tree("chuck", "p,,.xyz", "chuck.xyz", node)) {
+        qd_parse_tree_free(node);
         return "proposed link 'chuck.xyz' should tree-match allow links with ${user} but does not";
+    }
 
-    if (_qd_policy_approve_link_name_tree("chuck", "p,,.xyz", "chuck.xyz.ynot", node))
+    if (_qd_policy_approve_link_name_tree("chuck", "p,,.xyz", "chuck.xyz.ynot", node)) {
+        qd_parse_tree_free(node);
         return "proposed link 'chuck.xyz.ynot' should not tree-match allow links with ${user} but does";
+    }
 
     qd_parse_tree_add_pattern_str(node, "${user}.#", payload);
 
-    if (!_qd_policy_approve_link_name_tree("motronic", "p,,.#", "motronic", node))
+    if (!_qd_policy_approve_link_name_tree("motronic", "p,,.#", "motronic", node)) {
+        qd_parse_tree_free(node);
         return "proposed link 'motronic' should tree-match allow links with ${user} but does not";
+    }
 
-    if (!_qd_policy_approve_link_name_tree("motronic", "p,,.#", "motronic.stubs.wobbler", node))
+    if (!_qd_policy_approve_link_name_tree("motronic", "p,,.#", "motronic.stubs.wobbler", node)) {
+        qd_parse_tree_free(node);
         return "proposed link 'motronic.stubs.wobbler' should tree-match allow links with ${user} but does not";
+    }
 
     qd_parse_tree_t *node2 = qd_parse_tree_new(QD_PARSE_TREE_ADDRESS);
     qd_parse_tree_add_pattern_str(node2, "abc.${user}", payload);
 
-    if (!_qd_policy_approve_link_name_tree("chuck", "s,abc.,", "abc.chuck", node2))
+    if (!_qd_policy_approve_link_name_tree("chuck", "s,abc.,", "abc.chuck", node2)) {
+        qd_parse_tree_free(node);
+        qd_parse_tree_free(node2);
         return "proposed link 'abc.chuck' should tree-match allow links with ${user} but does not";
+    }
 
-    if (_qd_policy_approve_link_name_tree("chuck", "s,abc.,", "abc.ynot.chuck", node2))
+    if (_qd_policy_approve_link_name_tree("chuck", "s,abc.,", "abc.ynot.chuck", node2)) {
+        qd_parse_tree_free(node);
+        qd_parse_tree_free(node2);
         return "proposed link 'abc.ynot.chuck' should not tree-match allow links with ${user} but does";
+    }
 
-    if (_qd_policy_approve_link_name_tree("chuck", "s,abc.,", "abc.achuck", node2))
+    if (_qd_policy_approve_link_name_tree("chuck", "s,abc.,", "abc.achuck", node2)) {
+        qd_parse_tree_free(node);
+        qd_parse_tree_free(node2);
         return "proposed link 'abc.achuck' should not tree-match allow links with ${user} but does";
+    }
 
-    if (_qd_policy_approve_link_name_tree("chuckginormous", "s,abc.,", "abc.chuck", node2))
+    if (_qd_policy_approve_link_name_tree("chuckginormous", "s,abc.,", "abc.chuck", node2)) {
+        qd_parse_tree_free(node);
+        qd_parse_tree_free(node2);
         return "proposed link 'abc.chuck' should not tree-match allow links with ${user} but does";
+    }
 
     qd_parse_tree_t *node3 = qd_parse_tree_new(QD_PARSE_TREE_ADDRESS);
     qd_parse_tree_add_pattern_str(node3, "${user}", payload);
 
-    if (!_qd_policy_approve_link_name_tree("chuck", "p,,", "chuck", node3))
+    if (!_qd_policy_approve_link_name_tree("chuck", "p,,", "chuck", node3)) {
+        qd_parse_tree_free(node);
+        qd_parse_tree_free(node2);
+        qd_parse_tree_free(node3);
         return "proposed link 'chuck' should tree-match allow links with ${user} but does not";
+    }
 
     qd_parse_tree_free(node);
     qd_parse_tree_free(node2);
@@ -145,33 +169,45 @@ static char *test_link_name_csv_parser(void *context)
     char * result;
 
     result = qd_policy_compile_allowed_csv("ttt");
-    if (!!strcmp(result, "a,ttt,"))
+    if (!!strcmp(result, "a,ttt,")) {
+        free(result);
         return "simple csv with no subst failed";
+    }
     free(result);
 
     result = qd_policy_compile_allowed_csv("ttt,uuu,vvvv");
-    if (!!strcmp(result, "a,ttt,,a,uuu,,a,vvvv,"))
+    if (!!strcmp(result, "a,ttt,,a,uuu,,a,vvvv,")) {
+        free(result);
         return "moderate csv with no subst failed";
+    }
     free(result);
 
     result = qd_policy_compile_allowed_csv("*");
-    if (!!strcmp(result, "*,,"))
+    if (!!strcmp(result, "*,,")) {
+        free(result);
         return "wildcard csv failed";
+    }
     free(result);
 
     result = qd_policy_compile_allowed_csv("${user}-temp");
-    if (!!strcmp(result, "p,,-temp"))
+    if (!!strcmp(result, "p,,-temp")) {
+        free(result);
         return "csv with prefix subst failed";
+    }
     free(result);
 
     result = qd_policy_compile_allowed_csv("temp-${user}");
-    if (!!strcmp(result, "s,temp-,"))
+    if (!!strcmp(result, "s,temp-,")) {
+        free(result);
         return "csv with suffix subst failed";
+    }
     free(result);
 
     result = qd_policy_compile_allowed_csv("temp-${user}-home");
-    if (!!strcmp(result, "e,temp-,-home"))
+    if (!!strcmp(result, "e,temp-,-home")) {
+        free(result);
         return "csv with embedded subst failed";
+    }
     free(result);
 
     return 0;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/16674f44/tests/tool_test.c
----------------------------------------------------------------------
diff --git a/tests/tool_test.c b/tests/tool_test.c
index a8a894b..b0d07f3 100644
--- a/tests/tool_test.c
+++ b/tests/tool_test.c
@@ -256,30 +256,69 @@ static char* test_bitmask(void *context)
 
     bm = qd_bitmask(0);
     if (!bm)                             return "Can't allocate a bit mask";
-    if (qd_bitmask_first_set(bm, &num))  return "Expected no first set bit";
-    if (qd_bitmask_cardinality(bm) != 0) return "Expected cardinality == 0";
+    if (qd_bitmask_first_set(bm, &num)) {
+        qd_bitmask_free(bm);
+        return "Expected no first set bit";
+    }
+    if (qd_bitmask_cardinality(bm) != 0) {
+        qd_bitmask_free(bm);
+        return "Expected cardinality == 0";
+    }
 
     old = qd_bitmask_set_bit(bm, 3);
-    if (old)                             return "Expected old value to be zero";
-    if (qd_bitmask_cardinality(bm) != 1) return "Expected cardinality == 1";
+    if (old) {
+        qd_bitmask_free(bm);
+        return "Expected old value to be zero";
+    }
+    if (qd_bitmask_cardinality(bm) != 1) {
+        qd_bitmask_free(bm);
+        return "Expected cardinality == 1";
+    }
     old = qd_bitmask_set_bit(bm, 3);
-    if (!old)                            return "Expected old value to be one";
+    if (!old) {
+        qd_bitmask_free(bm);
+        return "Expected old value to be one";
+    }
     qd_bitmask_set_bit(bm, 100);
-    if (qd_bitmask_cardinality(bm) != 2) return "Expected cardinality == 2";
+    if (qd_bitmask_cardinality(bm) != 2) {
+        qd_bitmask_free(bm);
+        return "Expected cardinality == 2";
+    }
 
-    if (!qd_bitmask_first_set(bm, &num)) return "Expected first set bit";
-    if (num != 3)                        return "Expected first set bit to be 3";
+    if (!qd_bitmask_first_set(bm, &num)) {
+        qd_bitmask_free(bm);
+        return "Expected first set bit";
+    }
+    if (num != 3) {
+        qd_bitmask_free(bm);
+        return "Expected first set bit to be 3";
+    }
 
     old = qd_bitmask_clear_bit(bm, num);
-    if (!old)                            return "Expected old value to be one(2)";
+    if (!old) {
+        qd_bitmask_free(bm);
+        return "Expected old value to be one(2)";
+    }
     old = qd_bitmask_clear_bit(bm, num);
-    if (old)                             return "Expected old value to be zero(2)";
+    if (old) {
+        qd_bitmask_free(bm);
+        return "Expected old value to be zero(2)";
+    }
 
-    if (!qd_bitmask_first_set(bm, &num)) return "Expected first set bit (2)";
-    if (num != 100)                      return "Expected first set bit to be 100";
+    if (!qd_bitmask_first_set(bm, &num)) {
+        qd_bitmask_free(bm);
+        return "Expected first set bit (2)";
+    }
+    if (num != 100) {
+        qd_bitmask_free(bm);
+        return "Expected first set bit to be 100";
+    }
 
     qd_bitmask_clear_bit(bm, num);
-    if (qd_bitmask_first_set(bm, &num)) return "Expected no first set bit (2)";
+    if (qd_bitmask_first_set(bm, &num)) {
+        qd_bitmask_free(bm);
+        return "Expected no first set bit (2)";
+    }
 
     qd_bitmask_set_bit(bm, 6);
     qd_bitmask_set_bit(bm, 2);
@@ -289,7 +328,10 @@ static char* test_bitmask(void *context)
     qd_bitmask_clear_bit(bm, 8);
     qd_bitmask_clear_bit(bm, 80);
 
-    if (qd_bitmask_cardinality(bm) != 4) return "Expected cardinality == 4";
+    if (qd_bitmask_cardinality(bm) != 4) {
+        qd_bitmask_free(bm);
+        return "Expected cardinality == 4";
+    }
 
     total = 0;
     count = 0;
@@ -297,8 +339,14 @@ static char* test_bitmask(void *context)
         total += num;
         count++;
     }
-    if (count != 4)  return "Expected count to be 4";
-    if (total != 82) return "Expected bit-number total to be 82";
+    if (count != 4) {
+        qd_bitmask_free(bm);
+        return "Expected count to be 4";
+    }
+    if (total != 82) {
+        qd_bitmask_free(bm);
+        return "Expected bit-number total to be 82";
+    }
 
     qd_bitmask_free(bm);
 


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