summaryrefslogtreecommitdiff
path: root/res/res_resolver_unbound.c
diff options
context:
space:
mode:
authorRichard Mudgett <rmudgett@digium.com>2017-02-01 17:14:53 -0600
committerRichard Mudgett <rmudgett@digium.com>2017-02-01 17:33:41 -0600
commit7d9b50a7b2b202b3f34236bd951f4aaef79a441c (patch)
tree9cacd68b02a5250acfaee2cf0fd75e0f82d3606c /res/res_resolver_unbound.c
parent97d58add328cdfdbbf6d7ea7498e4789eaf47353 (diff)
res_resolver_unbound.c: Fix frequent ref leak caught by excessive ref trap.
ASTERISK-26765 Change-Id: I27eb97df7f8d7e624b0b9a61c0fcee4718c86d8d
Diffstat (limited to 'res/res_resolver_unbound.c')
-rw-r--r--res/res_resolver_unbound.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/res/res_resolver_unbound.c b/res/res_resolver_unbound.c
index 1877bbcc4..3c7805010 100644
--- a/res/res_resolver_unbound.c
+++ b/res/res_resolver_unbound.c
@@ -286,13 +286,21 @@ static void unbound_resolver_callback(void *data, int err, struct ub_result *ub_
ub_resolve_free(ub_result);
}
+static void unbound_resolver_data_dtor(void *vdoomed)
+{
+ struct unbound_resolver_data *doomed = vdoomed;
+
+ ao2_cleanup(doomed->resolver);
+}
+
static int unbound_resolver_resolve(struct ast_dns_query *query)
{
struct unbound_config *cfg = ao2_global_obj_ref(globals);
struct unbound_resolver_data *data;
int res;
- data = ao2_alloc_options(sizeof(*data), NULL, AO2_ALLOC_OPT_LOCK_NOLOCK);
+ data = ao2_alloc_options(sizeof(*data), unbound_resolver_data_dtor,
+ AO2_ALLOC_OPT_LOCK_NOLOCK);
if (!data) {
ast_log(LOG_ERROR, "Failed to allocate resolver data for resolution of '%s'\n",
ast_dns_query_get_name(query));