diff --git a/daemon/peer.c b/daemon/peer.c index 41f5a491e..13aae6042 100644 --- a/daemon/peer.c +++ b/daemon/peer.c @@ -220,17 +220,22 @@ static void try_command(struct peer *peer) struct peer *), \ (arg)) -static void queue_cmd_(struct peer *peer, +static bool queue_cmd_(struct peer *peer, void (*dequeue)(struct peer *peer, void *arg), void *arg) { - struct pending_cmd *pend = tal(peer, struct pending_cmd); + struct pending_cmd *pend; + if (peer->cond == PEER_CLOSING || peer->cond == PEER_CLOSED) + return false; + + pend = tal(peer, struct pending_cmd); pend->dequeue = dequeue; pend->arg = arg; list_add_tail(&peer->pending_cmd, &pend->list); try_command(peer); + return true; }; static void queue_input(struct peer *peer, @@ -2248,7 +2253,8 @@ static void json_newhtlc(struct command *cmd, return; } - queue_cmd(peer, do_newhtlc, newhtlc); + if (!queue_cmd(peer, do_newhtlc, newhtlc)) + command_fail(cmd, "Peer closing"); } /* FIXME: Use HTLC ids, not r values! */ @@ -2324,7 +2330,8 @@ static void json_fulfillhtlc(struct command *cmd, return; } - queue_cmd(peer, do_fullfill, fulfillhtlc); + if (!queue_cmd(peer, do_fullfill, fulfillhtlc)) + command_fail(cmd, "Peer closing"); } const struct json_command fulfillhtlc_command = { @@ -2398,7 +2405,8 @@ static void json_failhtlc(struct command *cmd, return; } - queue_cmd(peer, do_failhtlc, failhtlc); + if (!queue_cmd(peer, do_failhtlc, failhtlc)) + command_fail(cmd, "Peer closing"); } const struct json_command failhtlc_command = { @@ -2432,7 +2440,8 @@ static void json_commit(struct command *cmd, return; } - queue_cmd(peer, do_commit, cmd); + if (!queue_cmd(peer, do_commit, cmd)) + command_fail(cmd, "Peer closing"); } const struct json_command commit_command = {