From e734097125f1fa0f38052b8063149f7daba86865 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Tue, 15 Jun 2021 06:37:38 +0930 Subject: [PATCH] common/wireaddr: fromwire_wireaddr_array helper. This was previously internal to gossipd and was called "read_addresses". Signed-off-by: Rusty Russell --- common/wireaddr.c | 29 ++++++++++++++++ common/wireaddr.h | 3 ++ gossipd/gossipd.c | 2 +- gossipd/routing.c | 33 +------------------ gossipd/routing.h | 3 -- gossipd/test/run-bench-find_route.c | 6 ++-- gossipd/test/run-check_channel_announcement.c | 6 ++-- gossipd/test/run-find_route-specific.c | 6 ++-- gossipd/test/run-find_route.c | 6 ++-- gossipd/test/run-overlong.c | 6 ++-- gossipd/test/run-txout_failure.c | 6 ++-- 11 files changed, 52 insertions(+), 54 deletions(-) diff --git a/common/wireaddr.c b/common/wireaddr.c index b765157c3..3a0a37840 100644 --- a/common/wireaddr.c +++ b/common/wireaddr.c @@ -691,6 +691,35 @@ struct addrinfo *wireaddr_to_addrinfo(const tal_t *ctx, abort(); } +struct wireaddr *fromwire_wireaddr_array(const tal_t *ctx, const u8 *ser) +{ + const u8 *cursor = ser; + size_t len = tal_count(ser); + struct wireaddr *wireaddrs = tal_arr(ctx, struct wireaddr, 0); + + while (cursor && len) { + struct wireaddr wireaddr; + + /* BOLT #7: + * + * The receiving node: + *... + * - SHOULD ignore the first `address descriptor` that does + * NOT match the types defined above. + */ + if (!fromwire_wireaddr(&cursor, &len, &wireaddr)) { + if (!cursor) + /* Parsing address failed */ + return tal_free(wireaddrs); + /* Unknown type, stop there. */ + break; + } + + tal_arr_expand(&wireaddrs, wireaddr); + } + return wireaddrs; +} + bool all_tor_addresses(const struct wireaddr_internal *wireaddr) { for (int i = 0; i < tal_count(wireaddr); i++) { diff --git a/common/wireaddr.h b/common/wireaddr.h index 26612a16e..f45c2cc76 100644 --- a/common/wireaddr.h +++ b/common/wireaddr.h @@ -165,4 +165,7 @@ struct addrinfo *wireaddr_internal_to_addrinfo(const tal_t *ctx, bool all_tor_addresses(const struct wireaddr_internal *wireaddr); +/* Decode an array of serialized addresses from node_announcement */ +struct wireaddr *fromwire_wireaddr_array(const tal_t *ctx, const u8 *ser); + #endif /* LIGHTNING_COMMON_WIREADDR_H */ diff --git a/gossipd/gossipd.c b/gossipd/gossipd.c index 5619b5ef7..d495771e8 100644 --- a/gossipd/gossipd.c +++ b/gossipd/gossipd.c @@ -193,7 +193,7 @@ static bool get_node_announcement(const tal_t *ctx, return false; } - *wireaddrs = read_addresses(ctx, addresses); + *wireaddrs = fromwire_wireaddr_array(ctx, addresses); tal_free(addresses); return true; } diff --git a/gossipd/routing.c b/gossipd/routing.c index 321ce14ba..96e24d9ae 100644 --- a/gossipd/routing.c +++ b/gossipd/routing.c @@ -2383,37 +2383,6 @@ u8 *handle_channel_update(struct routing_state *rstate, const u8 *update TAKES, return NULL; } -struct wireaddr *read_addresses(const tal_t *ctx, const u8 *ser) -{ - const u8 *cursor = ser; - size_t len = tal_count(ser); - struct wireaddr *wireaddrs = tal_arr(ctx, struct wireaddr, 0); - - while (cursor && len) { - struct wireaddr wireaddr; - - /* BOLT #7: - * - * The receiving node: - *... - * - SHOULD ignore the first `address descriptor` that does - * NOT match the types defined above. - */ - if (!fromwire_wireaddr(&cursor, &len, &wireaddr)) { - if (!cursor) - /* Parsing address failed */ - return tal_free(wireaddrs); - /* Unknown type, stop there. */ - status_debug("read_addresses: unknown address type %u", - cursor[0]); - break; - } - - tal_arr_expand(&wireaddrs, wireaddr); - } - return wireaddrs; -} - bool routing_add_node_announcement(struct routing_state *rstate, const u8 *msg TAKES, u32 index, @@ -2619,7 +2588,7 @@ u8 *handle_node_announcement(struct routing_state *rstate, const u8 *node_ann, return err; } - wireaddrs = read_addresses(tmpctx, addresses); + wireaddrs = fromwire_wireaddr_array(tmpctx, addresses); if (!wireaddrs) { /* BOLT #7: * diff --git a/gossipd/routing.h b/gossipd/routing.h index 367054108..5cc4d5e96 100644 --- a/gossipd/routing.h +++ b/gossipd/routing.h @@ -511,9 +511,6 @@ static inline void local_enable_chan(struct routing_state *rstate, local_chan->local_disabled = false; } -/* Helper to convert on-wire addresses format to wireaddrs array */ -struct wireaddr *read_addresses(const tal_t *ctx, const u8 *ser); - /* Remove channel from store: announcement and any updates. */ void remove_channel_from_store(struct routing_state *rstate, struct chan *chan); diff --git a/gossipd/test/run-bench-find_route.c b/gossipd/test/run-bench-find_route.c index 0772b7d23..80b1533c9 100644 --- a/gossipd/test/run-bench-find_route.c +++ b/gossipd/test/run-bench-find_route.c @@ -39,9 +39,9 @@ bool cupdate_different(struct gossip_store *gs UNNEEDED, /* Generated stub for fmt_wireaddr_without_port */ char *fmt_wireaddr_without_port(const tal_t *ctx UNNEEDED, const struct wireaddr *a UNNEEDED) { fprintf(stderr, "fmt_wireaddr_without_port called!\n"); abort(); } -/* Generated stub for fromwire_wireaddr */ -bool fromwire_wireaddr(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, struct wireaddr *addr UNNEEDED) -{ fprintf(stderr, "fromwire_wireaddr called!\n"); abort(); } +/* Generated stub for fromwire_wireaddr_array */ +struct wireaddr *fromwire_wireaddr_array(const tal_t *ctx UNNEEDED, const u8 *ser UNNEEDED) +{ fprintf(stderr, "fromwire_wireaddr_array called!\n"); abort(); } /* Generated stub for json_add_member */ void json_add_member(struct json_stream *js UNNEEDED, const char *fieldname UNNEEDED, diff --git a/gossipd/test/run-check_channel_announcement.c b/gossipd/test/run-check_channel_announcement.c index cc77a3414..caaea2ca3 100644 --- a/gossipd/test/run-check_channel_announcement.c +++ b/gossipd/test/run-check_channel_announcement.c @@ -42,9 +42,9 @@ bool cupdate_different(struct gossip_store *gs UNNEEDED, /* Generated stub for fmt_wireaddr_without_port */ char *fmt_wireaddr_without_port(const tal_t *ctx UNNEEDED, const struct wireaddr *a UNNEEDED) { fprintf(stderr, "fmt_wireaddr_without_port called!\n"); abort(); } -/* Generated stub for fromwire_wireaddr */ -bool fromwire_wireaddr(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, struct wireaddr *addr UNNEEDED) -{ fprintf(stderr, "fromwire_wireaddr called!\n"); abort(); } +/* Generated stub for fromwire_wireaddr_array */ +struct wireaddr *fromwire_wireaddr_array(const tal_t *ctx UNNEEDED, const u8 *ser UNNEEDED) +{ fprintf(stderr, "fromwire_wireaddr_array called!\n"); abort(); } /* Generated stub for gossip_store_add */ u64 gossip_store_add(struct gossip_store *gs UNNEEDED, const u8 *gossip_msg UNNEEDED, u32 timestamp UNNEEDED, bool push UNNEEDED, const u8 *addendum UNNEEDED) diff --git a/gossipd/test/run-find_route-specific.c b/gossipd/test/run-find_route-specific.c index 64060092c..8431e25a5 100644 --- a/gossipd/test/run-find_route-specific.c +++ b/gossipd/test/run-find_route-specific.c @@ -25,9 +25,9 @@ bool cupdate_different(struct gossip_store *gs UNNEEDED, /* Generated stub for fmt_wireaddr_without_port */ char *fmt_wireaddr_without_port(const tal_t *ctx UNNEEDED, const struct wireaddr *a UNNEEDED) { fprintf(stderr, "fmt_wireaddr_without_port called!\n"); abort(); } -/* Generated stub for fromwire_wireaddr */ -bool fromwire_wireaddr(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, struct wireaddr *addr UNNEEDED) -{ fprintf(stderr, "fromwire_wireaddr called!\n"); abort(); } +/* Generated stub for fromwire_wireaddr_array */ +struct wireaddr *fromwire_wireaddr_array(const tal_t *ctx UNNEEDED, const u8 *ser UNNEEDED) +{ fprintf(stderr, "fromwire_wireaddr_array called!\n"); abort(); } /* Generated stub for json_add_member */ void json_add_member(struct json_stream *js UNNEEDED, const char *fieldname UNNEEDED, diff --git a/gossipd/test/run-find_route.c b/gossipd/test/run-find_route.c index 41400bf2c..1e63f6700 100644 --- a/gossipd/test/run-find_route.c +++ b/gossipd/test/run-find_route.c @@ -25,9 +25,9 @@ bool cupdate_different(struct gossip_store *gs UNNEEDED, /* Generated stub for fmt_wireaddr_without_port */ char *fmt_wireaddr_without_port(const tal_t *ctx UNNEEDED, const struct wireaddr *a UNNEEDED) { fprintf(stderr, "fmt_wireaddr_without_port called!\n"); abort(); } -/* Generated stub for fromwire_wireaddr */ -bool fromwire_wireaddr(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, struct wireaddr *addr UNNEEDED) -{ fprintf(stderr, "fromwire_wireaddr called!\n"); abort(); } +/* Generated stub for fromwire_wireaddr_array */ +struct wireaddr *fromwire_wireaddr_array(const tal_t *ctx UNNEEDED, const u8 *ser UNNEEDED) +{ fprintf(stderr, "fromwire_wireaddr_array called!\n"); abort(); } /* Generated stub for json_add_member */ void json_add_member(struct json_stream *js UNNEEDED, const char *fieldname UNNEEDED, diff --git a/gossipd/test/run-overlong.c b/gossipd/test/run-overlong.c index 2a16642f7..b643cd755 100644 --- a/gossipd/test/run-overlong.c +++ b/gossipd/test/run-overlong.c @@ -25,9 +25,9 @@ bool cupdate_different(struct gossip_store *gs UNNEEDED, /* Generated stub for fmt_wireaddr_without_port */ char *fmt_wireaddr_without_port(const tal_t *ctx UNNEEDED, const struct wireaddr *a UNNEEDED) { fprintf(stderr, "fmt_wireaddr_without_port called!\n"); abort(); } -/* Generated stub for fromwire_wireaddr */ -bool fromwire_wireaddr(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, struct wireaddr *addr UNNEEDED) -{ fprintf(stderr, "fromwire_wireaddr called!\n"); abort(); } +/* Generated stub for fromwire_wireaddr_array */ +struct wireaddr *fromwire_wireaddr_array(const tal_t *ctx UNNEEDED, const u8 *ser UNNEEDED) +{ fprintf(stderr, "fromwire_wireaddr_array called!\n"); abort(); } /* Generated stub for json_add_member */ void json_add_member(struct json_stream *js UNNEEDED, const char *fieldname UNNEEDED, diff --git a/gossipd/test/run-txout_failure.c b/gossipd/test/run-txout_failure.c index 044e8fed1..38cde87d4 100644 --- a/gossipd/test/run-txout_failure.c +++ b/gossipd/test/run-txout_failure.c @@ -13,9 +13,9 @@ bool cupdate_different(struct gossip_store *gs UNNEEDED, /* Generated stub for fmt_wireaddr_without_port */ char *fmt_wireaddr_without_port(const tal_t *ctx UNNEEDED, const struct wireaddr *a UNNEEDED) { fprintf(stderr, "fmt_wireaddr_without_port called!\n"); abort(); } -/* Generated stub for fromwire_wireaddr */ -bool fromwire_wireaddr(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, struct wireaddr *addr UNNEEDED) -{ fprintf(stderr, "fromwire_wireaddr called!\n"); abort(); } +/* Generated stub for fromwire_wireaddr_array */ +struct wireaddr *fromwire_wireaddr_array(const tal_t *ctx UNNEEDED, const u8 *ser UNNEEDED) +{ fprintf(stderr, "fromwire_wireaddr_array called!\n"); abort(); } /* Generated stub for gossip_store_add */ u64 gossip_store_add(struct gossip_store *gs UNNEEDED, const u8 *gossip_msg UNNEEDED, u32 timestamp UNNEEDED, bool push UNNEEDED, const u8 *addendum UNNEEDED)