wallet: Fix a column mismatch and use absolute column indices
We weren't incrementing the `col` for the `local_shutdown_idx` field, which meant that all following fields were incorrect. I removed the `col` computation and opted for absolute indices instead, since they are way less brittle. Just remember to add new fields to the query at the end so we don't have to shift too often :-) Reported-by: William Casarin @jb55 Signed-off-by: Christian Decker <decker.christian@gmail.com>
This commit is contained in:
parent
af7e6158af
commit
6beb4eb171
|
@ -367,63 +367,59 @@ static bool wallet_stmt2channel(struct wallet *w, sqlite3_stmt *stmt,
|
|||
struct wallet_channel *chan)
|
||||
{
|
||||
bool ok = true;
|
||||
int col = 0;
|
||||
struct channel_info *channel_info;
|
||||
u64 remote_config_id;
|
||||
|
||||
if (!chan->peer) {
|
||||
chan->peer = talz(chan, struct peer);
|
||||
}
|
||||
chan->id = sqlite3_column_int64(stmt, col++);
|
||||
chan->peer->dbid = sqlite3_column_int64(stmt, col++);
|
||||
chan->id = sqlite3_column_int64(stmt, 0);
|
||||
chan->peer->dbid = sqlite3_column_int64(stmt, 1);
|
||||
wallet_peer_load(w, chan->peer->dbid, chan->peer);
|
||||
|
||||
if (sqlite3_column_type(stmt, col) != SQLITE_NULL) {
|
||||
if (sqlite3_column_type(stmt, 2) != SQLITE_NULL) {
|
||||
chan->peer->scid = tal(chan->peer, struct short_channel_id);
|
||||
sqlite3_column_short_channel_id(stmt, col++, chan->peer->scid);
|
||||
sqlite3_column_short_channel_id(stmt, 2, chan->peer->scid);
|
||||
} else {
|
||||
chan->peer->scid = NULL;
|
||||
col++;
|
||||
}
|
||||
|
||||
chan->peer->our_config.id = sqlite3_column_int64(stmt, col++);
|
||||
chan->peer->our_config.id = sqlite3_column_int64(stmt, 3);
|
||||
wallet_channel_config_load(w, chan->peer->our_config.id, &chan->peer->our_config);
|
||||
remote_config_id = sqlite3_column_int64(stmt, col++);
|
||||
remote_config_id = sqlite3_column_int64(stmt, 4);
|
||||
|
||||
chan->peer->state = sqlite3_column_int(stmt, col++);
|
||||
chan->peer->funder = sqlite3_column_int(stmt, col++);
|
||||
chan->peer->channel_flags = sqlite3_column_int(stmt, col++);
|
||||
chan->peer->minimum_depth = sqlite3_column_int(stmt, col++);
|
||||
chan->peer->next_index[LOCAL] = sqlite3_column_int64(stmt, col++);
|
||||
chan->peer->next_index[REMOTE] = sqlite3_column_int64(stmt, col++);
|
||||
chan->peer->next_htlc_id = sqlite3_column_int64(stmt, col++);
|
||||
chan->peer->state = sqlite3_column_int(stmt, 5);
|
||||
chan->peer->funder = sqlite3_column_int(stmt, 6);
|
||||
chan->peer->channel_flags = sqlite3_column_int(stmt, 7);
|
||||
chan->peer->minimum_depth = sqlite3_column_int(stmt, 8);
|
||||
chan->peer->next_index[LOCAL] = sqlite3_column_int64(stmt, 9);
|
||||
chan->peer->next_index[REMOTE] = sqlite3_column_int64(stmt, 10);
|
||||
chan->peer->next_htlc_id = sqlite3_column_int64(stmt, 11);
|
||||
|
||||
if (sqlite3_column_type(stmt, col) != SQLITE_NULL) {
|
||||
assert(sqlite3_column_bytes(stmt, col) == 32);
|
||||
if (sqlite3_column_type(stmt, 12) != SQLITE_NULL) {
|
||||
assert(sqlite3_column_bytes(stmt, 12) == 32);
|
||||
chan->peer->funding_txid = tal(chan->peer, struct sha256_double);
|
||||
memcpy(chan->peer->funding_txid, sqlite3_column_blob(stmt, col), 32);
|
||||
memcpy(chan->peer->funding_txid, sqlite3_column_blob(stmt, 12), 32);
|
||||
} else {
|
||||
chan->peer->funding_txid = NULL;
|
||||
}
|
||||
col++;
|
||||
|
||||
chan->peer->funding_outnum = sqlite3_column_int(stmt, col++);
|
||||
chan->peer->funding_satoshi = sqlite3_column_int64(stmt, col++);
|
||||
chan->peer->funding_outnum = sqlite3_column_int(stmt, 13);
|
||||
chan->peer->funding_satoshi = sqlite3_column_int64(stmt, 14);
|
||||
chan->peer->remote_funding_locked =
|
||||
sqlite3_column_int(stmt, col++) != 0;
|
||||
chan->peer->push_msat = sqlite3_column_int64(stmt, col++);
|
||||
sqlite3_column_int(stmt, 15) != 0;
|
||||
chan->peer->push_msat = sqlite3_column_int64(stmt, 16);
|
||||
|
||||
if (sqlite3_column_type(stmt, col) != SQLITE_NULL) {
|
||||
if (sqlite3_column_type(stmt, 17) != SQLITE_NULL) {
|
||||
chan->peer->our_msatoshi = tal(chan->peer, u64);
|
||||
*chan->peer->our_msatoshi = sqlite3_column_int64(stmt, col);
|
||||
*chan->peer->our_msatoshi = sqlite3_column_int64(stmt, 17);
|
||||
}else {
|
||||
chan->peer->our_msatoshi = tal_free(chan->peer->our_msatoshi);
|
||||
}
|
||||
col++;
|
||||
|
||||
/* See if we have a valid commit_sig indicating the presence
|
||||
* of channel_info */
|
||||
if (sqlite3_column_type(stmt, col) != SQLITE_NULL) {
|
||||
if (sqlite3_column_type(stmt, 18) != SQLITE_NULL) {
|
||||
/* OK, so we have a valid sig, instantiate and/or fill
|
||||
* in channel_info */
|
||||
if (!chan->peer->channel_info)
|
||||
|
@ -431,61 +427,53 @@ static bool wallet_stmt2channel(struct wallet *w, sqlite3_stmt *stmt,
|
|||
channel_info = chan->peer->channel_info;
|
||||
|
||||
/* Populate channel_info */
|
||||
ok &= sqlite3_column_pubkey(stmt, col++, &chan->peer->channel_info->remote_fundingkey);
|
||||
ok &= sqlite3_column_pubkey(stmt, col++, &channel_info->theirbase.revocation);
|
||||
ok &= sqlite3_column_pubkey(stmt, col++, &channel_info->theirbase.payment);
|
||||
ok &= sqlite3_column_pubkey(stmt, col++, &channel_info->theirbase.htlc);
|
||||
ok &= sqlite3_column_pubkey(stmt, col++, &channel_info->theirbase.delayed_payment);
|
||||
ok &= sqlite3_column_pubkey(stmt, col++, &channel_info->remote_per_commit);
|
||||
ok &= sqlite3_column_pubkey(stmt, col++, &channel_info->old_remote_per_commit);
|
||||
channel_info->feerate_per_kw[LOCAL] = sqlite3_column_int(stmt, col++);
|
||||
channel_info->feerate_per_kw[REMOTE] = sqlite3_column_int(stmt, col++);
|
||||
ok &= sqlite3_column_pubkey(stmt, 18, &chan->peer->channel_info->remote_fundingkey);
|
||||
ok &= sqlite3_column_pubkey(stmt, 19, &channel_info->theirbase.revocation);
|
||||
ok &= sqlite3_column_pubkey(stmt, 20, &channel_info->theirbase.payment);
|
||||
ok &= sqlite3_column_pubkey(stmt, 21, &channel_info->theirbase.htlc);
|
||||
ok &= sqlite3_column_pubkey(stmt, 22, &channel_info->theirbase.delayed_payment);
|
||||
ok &= sqlite3_column_pubkey(stmt, 23, &channel_info->remote_per_commit);
|
||||
ok &= sqlite3_column_pubkey(stmt, 24, &channel_info->old_remote_per_commit);
|
||||
channel_info->feerate_per_kw[LOCAL] = sqlite3_column_int(stmt, 25);
|
||||
channel_info->feerate_per_kw[REMOTE] = sqlite3_column_int(stmt, 26);
|
||||
wallet_channel_config_load(w, remote_config_id, &chan->peer->channel_info->their_config);
|
||||
} else {
|
||||
/* No channel_info, skip positions in the result */
|
||||
col += 9;
|
||||
}
|
||||
|
||||
/* Load shachain */
|
||||
u64 shachain_id = sqlite3_column_int64(stmt, col++);
|
||||
u64 shachain_id = sqlite3_column_int64(stmt, 27);
|
||||
ok &= wallet_shachain_load(w, shachain_id, &chan->peer->their_shachain);
|
||||
|
||||
/* Do we have a non-null remote_shutdown_scriptpubkey? */
|
||||
if (sqlite3_column_type(stmt, col) != SQLITE_NULL) {
|
||||
chan->peer->remote_shutdown_scriptpubkey = tal_arr(chan->peer, u8, sqlite3_column_bytes(stmt, col));
|
||||
memcpy(chan->peer->remote_shutdown_scriptpubkey, sqlite3_column_blob(stmt, col), sqlite3_column_bytes(stmt, col));
|
||||
chan->peer->local_shutdown_idx = sqlite3_column_int64(stmt, col++);
|
||||
if (sqlite3_column_type(stmt, 28) != SQLITE_NULL) {
|
||||
chan->peer->remote_shutdown_scriptpubkey = tal_arr(chan->peer, u8, sqlite3_column_bytes(stmt, 28));
|
||||
memcpy(chan->peer->remote_shutdown_scriptpubkey, sqlite3_column_blob(stmt, 28), sqlite3_column_bytes(stmt, 28));
|
||||
chan->peer->local_shutdown_idx = sqlite3_column_int64(stmt, 29);
|
||||
} else {
|
||||
chan->peer->remote_shutdown_scriptpubkey = tal_free(chan->peer->remote_shutdown_scriptpubkey);
|
||||
chan->peer->local_shutdown_idx = -1;
|
||||
col += 2;
|
||||
}
|
||||
|
||||
/* Do we have a last_sent_commit, if yes, populate */
|
||||
if (sqlite3_column_type(stmt, col) != SQLITE_NULL) {
|
||||
if (sqlite3_column_type(stmt, 30) != SQLITE_NULL) {
|
||||
if (!chan->peer->last_sent_commit) {
|
||||
chan->peer->last_sent_commit = tal(chan->peer, struct changed_htlc);
|
||||
}
|
||||
chan->peer->last_sent_commit->newstate = sqlite3_column_int64(stmt, col++);
|
||||
chan->peer->last_sent_commit->id = sqlite3_column_int64(stmt, col++);
|
||||
chan->peer->last_sent_commit->newstate = sqlite3_column_int64(stmt, 30);
|
||||
chan->peer->last_sent_commit->id = sqlite3_column_int64(stmt, 31);
|
||||
} else {
|
||||
chan->peer->last_sent_commit = tal_free(chan->peer->last_sent_commit);
|
||||
col += 2;
|
||||
}
|
||||
|
||||
/* Do we have last_tx? If so, populate. */
|
||||
if (sqlite3_column_type(stmt, col) != SQLITE_NULL) {
|
||||
chan->peer->last_tx = sqlite3_column_tx(chan->peer, stmt, col++);
|
||||
if (sqlite3_column_type(stmt, 32) != SQLITE_NULL) {
|
||||
chan->peer->last_tx = sqlite3_column_tx(chan->peer, stmt, 32);
|
||||
chan->peer->last_sig = tal(chan->peer, secp256k1_ecdsa_signature);
|
||||
sqlite3_column_signature(stmt, col++, chan->peer->last_sig);
|
||||
sqlite3_column_signature(stmt, 33, chan->peer->last_sig);
|
||||
} else {
|
||||
chan->peer->last_tx = tal_free(chan->peer->last_tx);
|
||||
chan->peer->last_sig = tal_free(chan->peer->last_sig);
|
||||
col += 2;
|
||||
}
|
||||
|
||||
assert(col == 34);
|
||||
|
||||
chan->peer->channel = chan;
|
||||
|
||||
return ok;
|
||||
|
|
Loading…
Reference in New Issue