mirror of
https://github.com/aljazceru/lightning.git
synced 2026-02-07 15:14:21 +01:00
gossipd: don't accept forwarding short_channel_ids we don't own.
Gossipd provided a generic "get endpoints of this scid" and we only use it in one place: to look up htlc forwards. But lightningd just assumed that one would be us. Instead, provide a simpler API which only returns the peer node if any, and now we handle it much more gracefully. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
@@ -106,7 +106,7 @@ static unsigned gossip_msg(struct subd *gossip, const u8 *msg, const int *fds)
|
||||
case WIRE_GOSSIP_GETROUTE_REQUEST:
|
||||
case WIRE_GOSSIP_GETCHANNELS_REQUEST:
|
||||
case WIRE_GOSSIP_PING:
|
||||
case WIRE_GOSSIP_RESOLVE_CHANNEL_REQUEST:
|
||||
case WIRE_GOSSIP_GET_CHANNEL_PEER:
|
||||
case WIRE_GOSSIP_GET_UPDATE:
|
||||
case WIRE_GOSSIP_SEND_GOSSIP:
|
||||
case WIRE_GOSSIP_GET_TXOUT_REPLY:
|
||||
@@ -126,7 +126,7 @@ static unsigned gossip_msg(struct subd *gossip, const u8 *msg, const int *fds)
|
||||
case WIRE_GOSSIP_GETCHANNELS_REPLY:
|
||||
case WIRE_GOSSIP_SCIDS_REPLY:
|
||||
case WIRE_GOSSIP_QUERY_CHANNEL_RANGE_REPLY:
|
||||
case WIRE_GOSSIP_RESOLVE_CHANNEL_REPLY:
|
||||
case WIRE_GOSSIP_GET_CHANNEL_PEER_REPLY:
|
||||
case WIRE_GOSSIP_GET_INCOMING_CHANNELS_REPLY:
|
||||
/* These are inter-daemon messages, not received by us */
|
||||
case WIRE_GOSSIP_LOCAL_ADD_CHANNEL:
|
||||
|
||||
@@ -569,30 +569,18 @@ struct gossip_resolve {
|
||||
static void channel_resolve_reply(struct subd *gossip, const u8 *msg,
|
||||
const int *fds UNUSED, struct gossip_resolve *gr)
|
||||
{
|
||||
struct pubkey *nodes, *peer_id;
|
||||
struct pubkey *peer_id;
|
||||
|
||||
if (!fromwire_gossip_resolve_channel_reply(msg, msg, &nodes)) {
|
||||
if (!fromwire_gossip_get_channel_peer_reply(msg, msg, &peer_id)) {
|
||||
log_broken(gossip->log,
|
||||
"bad fromwire_gossip_resolve_channel_reply %s",
|
||||
"bad fromwire_gossip_get_channel_peer_reply %s",
|
||||
tal_hex(msg, msg));
|
||||
return;
|
||||
}
|
||||
|
||||
if (tal_count(nodes) == 0) {
|
||||
if (!peer_id) {
|
||||
local_fail_htlc(gr->hin, WIRE_UNKNOWN_NEXT_PEER, NULL);
|
||||
return;
|
||||
} else if (tal_count(nodes) != 2) {
|
||||
log_broken(gossip->log,
|
||||
"fromwire_gossip_resolve_channel_reply has %zu nodes",
|
||||
tal_count(nodes));
|
||||
return;
|
||||
}
|
||||
|
||||
/* Get the other peer matching the id that is not us */
|
||||
if (pubkey_cmp(&nodes[0], &gossip->ld->id) == 0) {
|
||||
peer_id = &nodes[1];
|
||||
} else {
|
||||
peer_id = &nodes[0];
|
||||
}
|
||||
|
||||
forward_htlc(gr->hin, gr->hin->cltv_expiry,
|
||||
@@ -697,8 +685,7 @@ static bool peer_accepted_htlc(struct channel *channel,
|
||||
gr->outgoing_cltv_value = rs->hop_data.outgoing_cltv;
|
||||
gr->hin = hin;
|
||||
|
||||
req = towire_gossip_resolve_channel_request(tmpctx,
|
||||
&gr->next_channel);
|
||||
req = towire_gossip_get_channel_peer(tmpctx, &gr->next_channel);
|
||||
log_debug(channel->log, "Asking gossip to resolve channel %s",
|
||||
type_to_string(tmpctx, struct short_channel_id,
|
||||
&gr->next_channel));
|
||||
|
||||
Reference in New Issue
Block a user