diff options
author | nicm <nicm> | 2016-10-14 18:41:53 +0000 |
---|---|---|
committer | nicm <nicm> | 2016-10-14 18:41:53 +0000 |
commit | 1721d1994eb03beb8217fa3e61ed0cc097dd899e (patch) | |
tree | 43e7b2ac7cfbfee0b83cb80f59133d9ee9e65f0f /cmd-source-file.c | |
parent | 0ec18e537d7f67732a789c0984bc1cb89dbb0adf (diff) |
source-file and some other commands can recurse back into cmdq_continue,
which could potentially free the currently running command, so we need
to take a reference to it in cmdq_continue_one.
Fixes problem reported by Theo Buehler.
Diffstat (limited to 'cmd-source-file.c')
-rw-r--r-- | cmd-source-file.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/cmd-source-file.c b/cmd-source-file.c index 0f299ddf..336a79e6 100644 --- a/cmd-source-file.c +++ b/cmd-source-file.c @@ -68,6 +68,8 @@ cmd_source_file_exec(struct cmd *self, struct cmd_q *cmdq) return (CMD_RETURN_NORMAL); } + log_debug("%s: cmdq %p, parent %p", __func__, cmdq1, cmdq); + cmdq->references++; cfg_references++; @@ -80,16 +82,15 @@ cmd_source_file_done(struct cmd_q *cmdq1) { struct cmd_q *cmdq = cmdq1->data; + log_debug("%s: cmdq %p, parent %p", __func__, cmdq1, cmdq); + if (cmdq1->client_exit >= 0) cmdq->client_exit = cmdq1->client_exit; - cmdq_free(cmdq1); cfg_references--; - if (cmdq_free(cmdq)) return; - if (cfg_references == 0) cfg_print_causes(cmdq); cmdq_continue(cmdq); |