Skip to content

Commit

Permalink
First pass through action_list must happen early
Browse files Browse the repository at this point in the history
The actions on the list may deal with what is then freed:

```
28: /home/travis/build/apache/qpid-dispatch/src/router_core/route_tables.c:530:17: runtime error: member access within null pointer of type 'struct qdr_node_t'
28:     #0 0x3ff9628d5bd in qdr_set_cost_CT /home/travis/build/apache/qpid-dispatch/src/router_core/route_tables.c:530
28:     #1 0x3ff9627e7cb in qdr_core_free /home/travis/build/apache/qpid-dispatch/src/router_core/router_core.c:251
28:     #2 0x3ff962e13f9 in qd_router_free /home/travis/build/apache/qpid-dispatch/src/router_node.c:2160
28:     #3 0x3ff9617979d in qd_dispatch_free /home/travis/build/apache/qpid-dispatch/src/dispatch.c:375
28:     #4 0x3ff9617979d in qd_dispatch_free /home/travis/build/apache/qpid-dispatch/src/dispatch.c:363
28:     #5 0x2aa23604fa9 in main_process /home/travis/build/apache/qpid-dispatch/router/src/main.c:119
28:     #6 0x2aa23604a23 in main /home/travis/build/apache/qpid-dispatch/router/src/main.c:369
28:     #7 0x3ff94faa5f9 in __libc_start_main (/lib/s390x-linux-gnu/libc.so.6+0x2a5f9)
28:     #8 0x2aa23604d23  (/home/travis/build/apache/qpid-dispatch/build/router/qdrouterd+0x4d23)
```
  • Loading branch information
jiridanek committed May 26, 2021
1 parent dd4ccf4 commit bc29b0a
Showing 1 changed file with 25 additions and 12 deletions.
37 changes: 25 additions & 12 deletions src/router_core/router_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,19 @@ qdr_core_t *qdr_core(qd_dispatch_t *qd, qd_router_mode_t mode, const char *area,
return core;
}

static void discard_left_over_actions(qdr_core_t *core)
{
qdr_action_list_t action_list;
DEQ_MOVE(core->action_list, action_list);
DEQ_APPEND(action_list, core->action_list_background);
qdr_action_t *action = DEQ_HEAD(action_list);
while (action) {
DEQ_REMOVE_HEAD(action_list);
action->action_handler(core, action, true);
free_qdr_action_t(action);
action = DEQ_HEAD(action_list);
}
}

void qdr_core_free(qdr_core_t *core)
{
Expand All @@ -152,6 +165,14 @@ void qdr_core_free(qdr_core_t *core)
core->router_id = 0;
core->router_area = 0;

//
// discard any left over actions
//

discard_left_over_actions(core);
// Drain the general work lists
qdr_general_handler(core);

//
// Free the core resources
//
Expand Down Expand Up @@ -240,19 +261,11 @@ void qdr_core_free(qdr_core_t *core)
// this must happen after qdrc_endpoint_do_cleanup_CT calls
qdr_modules_finalize(core);

// discard any left over actions

qdr_action_list_t action_list;
DEQ_MOVE(core->action_list, action_list);
DEQ_APPEND(action_list, core->action_list_background);
qdr_action_t *action = DEQ_HEAD(action_list);
while (action) {
DEQ_REMOVE_HEAD(action_list);
action->action_handler(core, action, true);
free_qdr_action_t(action);
action = DEQ_HEAD(action_list);
}
//
// discard any left over actions (again)
//

discard_left_over_actions(core);
// Drain the general work lists
qdr_general_handler(core);

Expand Down

0 comments on commit bc29b0a

Please sign in to comment.