Skip to content

Commit 9718ba8

Browse files
committed
DISPATCH-1962 Fix leak of qdr_core_subscribe
1 parent 25f720c commit 9718ba8

File tree

2 files changed

+26
-26
lines changed

2 files changed

+26
-26
lines changed

src/router_core/modules/mobile_sync/mobile.c

+2-3
Original file line numberDiff line numberDiff line change
@@ -939,9 +939,8 @@ static void qcm_mobile_sync_final_CT(void *module_context)
939939
qdrc_event_unsubscribe_CT(msync->core, msync->event_sub);
940940
qdr_core_timer_free_CT(msync->core, msync->timer);
941941

942-
//
943-
// Don't explicitly unsubscribe the addresses, these are already gone at module-final time.
944-
//
942+
qdr_core_unsubscribe(msync->message_sub1);
943+
qdr_core_unsubscribe(msync->message_sub2);
945944

946945
free(msync);
947946
}

src/router_core/router_core.c

+24-23
Original file line numberDiff line numberDiff line change
@@ -150,32 +150,9 @@ void qdr_core_free(qdr_core_t *core)
150150
core->router_id = 0;
151151
core->router_area = 0;
152152

153-
// discard any left over actions
154-
155-
qdr_action_list_t action_list;
156-
DEQ_MOVE(core->action_list, action_list);
157-
DEQ_APPEND(action_list, core->action_list_background);
158-
qdr_action_t *action = DEQ_HEAD(action_list);
159-
while (action) {
160-
DEQ_REMOVE_HEAD(action_list);
161-
action->action_handler(core, action, true);
162-
free_qdr_action_t(action);
163-
action = DEQ_HEAD(action_list);
164-
}
165-
166-
// Drain the general work lists
167-
qdr_general_handler(core);
168-
169153
//
170154
// Free the core resources
171155
//
172-
sys_thread_free(core->thread);
173-
sys_cond_free(core->action_cond);
174-
sys_mutex_free(core->action_lock);
175-
sys_mutex_free(core->work_lock);
176-
sys_mutex_free(core->id_lock);
177-
qd_timer_free(core->work_timer);
178-
179156
for (int i = 0; i <= QD_TREATMENT_LINK_BALANCED; ++i) {
180157
if (core->forwarders[i]) {
181158
free(core->forwarders[i]);
@@ -306,8 +283,25 @@ void qdr_core_free(qdr_core_t *core)
306283
// at this point all the conn identifiers have been freed
307284
qd_hash_free(core->conn_id_hash);
308285

286+
// finalize modules while we can still submit new actions
309287
qdr_modules_finalize(core);
310288

289+
// discard any left over actions
290+
291+
qdr_action_list_t action_list;
292+
DEQ_MOVE(core->action_list, action_list);
293+
DEQ_APPEND(action_list, core->action_list_background);
294+
qdr_action_t *action = DEQ_HEAD(action_list);
295+
while (action) {
296+
DEQ_REMOVE_HEAD(action_list);
297+
action->action_handler(core, action, true);
298+
free_qdr_action_t(action);
299+
action = DEQ_HEAD(action_list);
300+
}
301+
302+
// Drain the general work lists
303+
qdr_general_handler(core);
304+
311305
qdr_agent_free(core->mgmt_agent);
312306

313307
if (core->routers_by_mask_bit) free(core->routers_by_mask_bit);
@@ -316,6 +310,13 @@ void qdr_core_free(qdr_core_t *core)
316310
if (core->neighbor_free_mask) qd_bitmask_free(core->neighbor_free_mask);
317311
if (core->rnode_conns_by_mask_bit) free(core->rnode_conns_by_mask_bit);
318312

313+
sys_thread_free(core->thread);
314+
sys_cond_free(core->action_cond);
315+
sys_mutex_free(core->action_lock);
316+
sys_mutex_free(core->work_lock);
317+
sys_mutex_free(core->id_lock);
318+
qd_timer_free(core->work_timer);
319+
319320
free(core);
320321
}
321322

0 commit comments

Comments
 (0)