From ba73787eccc83628c9956e5ad24d4d6fa200dcfe Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Fri, 25 Sep 2015 11:51:19 +0930 Subject: [PATCH] state: use INPUT_RVALUE instead of CMD_SEND_HTLC_FULFILL during closing. We'd expect stop_commands to stop all commands, but we (ab)used CMD_SEND_HTLC_FULFILL to send us R values even in closing state. Signed-off-by: Rusty Russell --- state.c | 6 +++--- state_types.h | 10 +++++++++- test/test_state_coverage.c | 5 +++-- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/state.c b/state.c index 010e9e07c..a10dad1a1 100644 --- a/state.c +++ b/state.c @@ -740,7 +740,7 @@ enum state state(const enum state state, const struct state_data *sdata, idata->cmd, BITCOIN_HTLC_RETURN_SPEND_DONE)); return state; - } else if (input_is(input, CMD_SEND_HTLC_FULFILL)) { + } else if (input_is(input, INPUT_RVALUE)) { /* This gives us the r value. */ set_effect(effect, r_value, r_value_from_cmd(effect, sdata, @@ -1060,8 +1060,8 @@ fail_during_close: BITCOIN_HTLC_TOTHEM_TIMEOUT); /* Expect either close or spendthem to complete */ if (htlcs) { - /* FIXME: Make sure caller uses CMD_HTLC_FULFILL again - * if they were in the middle of one! */ + /* FIXME: Make sure caller uses INPUT_RVAL + * if they were in the middle of FULFILL! */ set_effect(effect, watch_htlcs, htlcs); return STATE_CLOSE_WAIT_SPENDTHEM_CLOSE_WITH_HTLCS; } diff --git a/state_types.h b/state_types.h index 723ec3630..9f41abd20 100644 --- a/state_types.h +++ b/state_types.h @@ -257,7 +257,15 @@ enum state_input { * Timeouts. */ INPUT_CLOSE_COMPLETE_TIMEOUT, - + + /* + * Inject a known R value. + * + * In normal operation, use CMD_SEND_HTLC_FULFILL; this is for + * after a unilateral close. + */ + INPUT_RVALUE, + /* Commands */ CMD_SEND_HTLC_UPDATE, CMD_SEND_HTLC_FULFILL, diff --git a/test/test_state_coverage.c b/test/test_state_coverage.c index 82823cabe..0c9c0d3a6 100644 --- a/test/test_state_coverage.c +++ b/test/test_state_coverage.c @@ -1019,6 +1019,7 @@ static struct trail *add_trail(enum state_input input, t->before = *before; t->after = *after; if (input == CMD_SEND_HTLC_FULFILL + || input == INPUT_RVALUE || input == BITCOIN_HTLC_TOTHEM_TIMEOUT || input == BITCOIN_HTLC_TOTHEM_SPENT || input == BITCOIN_HTLC_TOUS_TIMEOUT @@ -1741,7 +1742,7 @@ static bool can_refire(enum state_input i) /* They could have lots of htlcs. */ if (i == BITCOIN_HTLC_TOTHEM_SPENT || i == BITCOIN_HTLC_TOTHEM_TIMEOUT - || i == BITCOIN_HTLC_TOUS_TIMEOUT || i == CMD_SEND_HTLC_FULFILL) + || i == BITCOIN_HTLC_TOUS_TIMEOUT) return true; /* We manually remove these if they're not watching any more spends */ @@ -1870,7 +1871,7 @@ static struct trail *run_peer(const struct state_data *sdata, idata->htlc = (struct htlc *)©.live_htlcs_to_us[i]; /* Only send this once. */ if (!rval_known(sdata, idata->htlc->id)) { - t = try_input(©, CMD_SEND_HTLC_FULFILL, + t = try_input(©, INPUT_RVALUE, idata, normalpath, errorpath, depth, hist); if (t)