mirror of
https://github.com/ElementsProject/lightning.git
synced 2025-03-02 18:35:00 +01:00
routing: use marshalled short_channel_id, not string as tag for channel_announce
We use this technique for the other tags, so use it here too. This was drawn to my attention when I made more than 10 channels in a block, and the string changed length: Valgrind error file: valgrind-errors.31415 ==31415== Conditional jump or move depends on uninitialised value(s) ==31415== at 0x4C35E20: bcmp (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==31415== by 0x11A624: queue_broadcast (broadcast.c:40) ==31415== by 0x118D93: handle_pending_cannouncement (routing.c:704) ==31415== by 0x1109E3: handle_txout_reply (gossip.c:1796) ==31415== by 0x111177: recv_req (gossip.c:1955) ==31415== by 0x136723: next_plan (io.c:59) ==31415== by 0x137220: do_plan (io.c:387) ==31415== by 0x13725E: io_ready (io.c:397) ==31415== by 0x138B97: io_loop (poll.c:305) ==31415== by 0x111352: main (gossip.c:2022) Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
parent
3d91bf2ab8
commit
8fcb45c1b2
1 changed files with 18 additions and 15 deletions
|
@ -549,7 +549,6 @@ const struct short_channel_id *handle_channel_announcement(
|
||||||
struct pending_cannouncement *pending;
|
struct pending_cannouncement *pending;
|
||||||
struct bitcoin_blkid chain_hash;
|
struct bitcoin_blkid chain_hash;
|
||||||
u8 *features;
|
u8 *features;
|
||||||
const char *tag;
|
|
||||||
secp256k1_ecdsa_signature node_signature_1, node_signature_2;
|
secp256k1_ecdsa_signature node_signature_1, node_signature_2;
|
||||||
secp256k1_ecdsa_signature bitcoin_signature_1, bitcoin_signature_2;
|
secp256k1_ecdsa_signature bitcoin_signature_1, bitcoin_signature_2;
|
||||||
struct node_connection *c0, *c1;
|
struct node_connection *c0, *c1;
|
||||||
|
@ -576,10 +575,6 @@ const struct short_channel_id *handle_channel_announcement(
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
tag = type_to_string(pending, struct short_channel_id,
|
|
||||||
&pending->short_channel_id);
|
|
||||||
tal_resize(&tag, strlen(tag));
|
|
||||||
|
|
||||||
/* BOLT #7:
|
/* BOLT #7:
|
||||||
*
|
*
|
||||||
* If there is an unknown even bit in the `features` field the
|
* If there is an unknown even bit in the `features` field the
|
||||||
|
@ -602,7 +597,8 @@ const struct short_channel_id *handle_channel_announcement(
|
||||||
if (!structeq(&chain_hash, &rstate->chain_hash)) {
|
if (!structeq(&chain_hash, &rstate->chain_hash)) {
|
||||||
status_trace(
|
status_trace(
|
||||||
"Received channel_announcement %s for unknown chain %s",
|
"Received channel_announcement %s for unknown chain %s",
|
||||||
tag,
|
type_to_string(pending, struct short_channel_id,
|
||||||
|
&pending->short_channel_id),
|
||||||
type_to_string(pending, struct bitcoin_blkid, &chain_hash));
|
type_to_string(pending, struct bitcoin_blkid, &chain_hash));
|
||||||
tal_free(pending);
|
tal_free(pending);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -617,13 +613,16 @@ const struct short_channel_id *handle_channel_announcement(
|
||||||
&bitcoin_signature_2,
|
&bitcoin_signature_2,
|
||||||
pending->announce)) {
|
pending->announce)) {
|
||||||
status_trace("Signature verification of channel_announcement"
|
status_trace("Signature verification of channel_announcement"
|
||||||
" for %s failed", tag);
|
" for %s failed",
|
||||||
|
type_to_string(pending, struct short_channel_id,
|
||||||
|
&pending->short_channel_id));
|
||||||
tal_free(pending);
|
tal_free(pending);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
status_trace("Received channel_announcement for channel %s", tag);
|
status_trace("Received channel_announcement for channel %s",
|
||||||
tal_free(tag);
|
type_to_string(pending, struct short_channel_id,
|
||||||
|
&pending->short_channel_id));
|
||||||
|
|
||||||
/* FIXME: Handle duplicates as per BOLT #7 */
|
/* FIXME: Handle duplicates as per BOLT #7 */
|
||||||
|
|
||||||
|
@ -647,7 +646,7 @@ bool handle_pending_cannouncement(struct routing_state *rstate,
|
||||||
{
|
{
|
||||||
bool forward, local;
|
bool forward, local;
|
||||||
struct node_connection *c0, *c1;
|
struct node_connection *c0, *c1;
|
||||||
const char *tag;
|
u8 *tag;
|
||||||
const u8 *s;
|
const u8 *s;
|
||||||
struct pending_cannouncement *pending;
|
struct pending_cannouncement *pending;
|
||||||
|
|
||||||
|
@ -655,15 +654,17 @@ bool handle_pending_cannouncement(struct routing_state *rstate,
|
||||||
assert(pending);
|
assert(pending);
|
||||||
list_del_from(&rstate->pending_cannouncement, &pending->list);
|
list_del_from(&rstate->pending_cannouncement, &pending->list);
|
||||||
|
|
||||||
tag = type_to_string(pending, struct short_channel_id, scid);
|
tag = tal_arr(pending, u8, 0);
|
||||||
tal_resize(&tag, strlen(tag));
|
towire_short_channel_id(&tag, scid);
|
||||||
|
|
||||||
/* BOLT #7:
|
/* BOLT #7:
|
||||||
*
|
*
|
||||||
* The receiving node MUST ignore the message if this output is spent.
|
* The receiving node MUST ignore the message if this output is spent.
|
||||||
*/
|
*/
|
||||||
if (tal_len(outscript) == 0) {
|
if (tal_len(outscript) == 0) {
|
||||||
status_trace("channel_announcement: no unspent txout %s", tag);
|
status_trace("channel_announcement: no unspent txout %s",
|
||||||
|
type_to_string(pending, struct short_channel_id,
|
||||||
|
scid));
|
||||||
tal_free(pending);
|
tal_free(pending);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -683,7 +684,9 @@ bool handle_pending_cannouncement(struct routing_state *rstate,
|
||||||
|
|
||||||
if (!scripteq(s, outscript)) {
|
if (!scripteq(s, outscript)) {
|
||||||
status_trace("channel_announcement: txout %s expectes %s, got %s",
|
status_trace("channel_announcement: txout %s expectes %s, got %s",
|
||||||
tag, tal_hex(trc, s), tal_hex(trc, outscript));
|
type_to_string(pending, struct short_channel_id,
|
||||||
|
scid),
|
||||||
|
tal_hex(trc, s), tal_hex(trc, outscript));
|
||||||
tal_free(pending);
|
tal_free(pending);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -703,7 +706,7 @@ bool handle_pending_cannouncement(struct routing_state *rstate,
|
||||||
if (forward) {
|
if (forward) {
|
||||||
if (queue_broadcast(rstate->broadcasts,
|
if (queue_broadcast(rstate->broadcasts,
|
||||||
WIRE_CHANNEL_ANNOUNCEMENT,
|
WIRE_CHANNEL_ANNOUNCEMENT,
|
||||||
(u8*)tag, pending->announce))
|
tag, pending->announce))
|
||||||
status_failed(STATUS_FAIL_INTERNAL_ERROR,
|
status_failed(STATUS_FAIL_INTERNAL_ERROR,
|
||||||
"Announcement %s was replaced?",
|
"Announcement %s was replaced?",
|
||||||
tal_hex(trc, pending->announce));
|
tal_hex(trc, pending->announce));
|
||||||
|
|
Loading…
Add table
Reference in a new issue