From bc430cced31f6e740ccc1fbf445c898705e5334e Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Tue, 15 Oct 2019 13:09:13 +1030 Subject: [PATCH] gossipd: fix false-positive memleak detection in pending_node_map. lightning_gossipd(17421): MEMLEAK: 0x564b4b17b5a8 ligtning_gossipd(17421): label=gossipd/routing.c:1490:struct pending_node_announce lightning_gossipd(17421): backtrace: lightning_gossipd(17421): ccan/ccan/tal/tal.c:437 (tal_alloc_) lightning_gossipd(17421): gossipd/routing.c:1490 (catch_node_announcement) lightning_gossipd(17421): gossipd/routing.c:1837 (handle_channel_announcement) lightning_gossipd(17421): gossipd/gossipd.c:238 (handle_channel_announcement_msg) lightning_gossipd(17421): gossipd/gossipd.c:461 (peer_msg_in) lightning_gossipd(17421): common/daemon_conn.c:31 (handle_read) lightning_gossipd(17421): ccan/ccan/io/io.c:59 (next_plan) lightning_gossipd(17421): ccan/ccan/io/io.c:407 (do_plan) lightning_gossipd(17421): ccan/ccan/io/io.c:417 (io_ready) lightning_gossipd(17421): ccan/ccan/io/poll.c:445 (io_loop) lightning_gossipd(17421): gossipd/gossipd.c:1700 (main) lightning_gossipd(17421): parents: lightning_gossipd(17421): gossipd/routing.c:294:struct routing_state Signed-off-by: Rusty Russell --- gossipd/routing.c | 2 +- gossipd/test/run-bench-find_route.c | 3 +++ gossipd/test/run-find_route-specific.c | 3 +++ gossipd/test/run-find_route.c | 3 +++ gossipd/test/run-overlong.c | 3 +++ gossipd/test/run-txout_failure.c | 3 +++ 6 files changed, 16 insertions(+), 1 deletion(-) diff --git a/gossipd/routing.c b/gossipd/routing.c index c646f971d..c43ea757c 100644 --- a/gossipd/routing.c +++ b/gossipd/routing.c @@ -1528,7 +1528,7 @@ static void process_pending_node_announcement(struct routing_state *rstate, * accepted the public channel now. But other pending announcements * may still hold a reference they use in * del_pending_node_announcement, so simply delete it from the map. */ - pending_node_map_del(rstate->pending_node_map, pna); + pending_node_map_del(rstate->pending_node_map, notleak(pna)); } static struct pending_cannouncement * diff --git a/gossipd/test/run-bench-find_route.c b/gossipd/test/run-bench-find_route.c index b7cc22a91..a8b205f52 100644 --- a/gossipd/test/run-bench-find_route.c +++ b/gossipd/test/run-bench-find_route.c @@ -51,6 +51,9 @@ bool nannounce_different(struct gossip_store *gs UNNEEDED, const struct node *node UNNEEDED, const u8 *nannounce UNNEEDED) { fprintf(stderr, "nannounce_different called!\n"); abort(); } +/* Generated stub for notleak_ */ +void *notleak_(const void *ptr UNNEEDED, bool plus_children UNNEEDED) +{ fprintf(stderr, "notleak_ called!\n"); abort(); } /* Generated stub for onion_type_name */ const char *onion_type_name(int e UNNEEDED) { fprintf(stderr, "onion_type_name called!\n"); abort(); } diff --git a/gossipd/test/run-find_route-specific.c b/gossipd/test/run-find_route-specific.c index b5e04ef12..56e07c448 100644 --- a/gossipd/test/run-find_route-specific.c +++ b/gossipd/test/run-find_route-specific.c @@ -40,6 +40,9 @@ bool nannounce_different(struct gossip_store *gs UNNEEDED, const struct node *node UNNEEDED, const u8 *nannounce UNNEEDED) { fprintf(stderr, "nannounce_different called!\n"); abort(); } +/* Generated stub for notleak_ */ +void *notleak_(const void *ptr UNNEEDED, bool plus_children UNNEEDED) +{ fprintf(stderr, "notleak_ called!\n"); abort(); } /* Generated stub for onion_type_name */ const char *onion_type_name(int e UNNEEDED) { fprintf(stderr, "onion_type_name called!\n"); abort(); } diff --git a/gossipd/test/run-find_route.c b/gossipd/test/run-find_route.c index f76693fab..c81f8e518 100644 --- a/gossipd/test/run-find_route.c +++ b/gossipd/test/run-find_route.c @@ -38,6 +38,9 @@ bool nannounce_different(struct gossip_store *gs UNNEEDED, const struct node *node UNNEEDED, const u8 *nannounce UNNEEDED) { fprintf(stderr, "nannounce_different called!\n"); abort(); } +/* Generated stub for notleak_ */ +void *notleak_(const void *ptr UNNEEDED, bool plus_children UNNEEDED) +{ fprintf(stderr, "notleak_ called!\n"); abort(); } /* Generated stub for onion_type_name */ const char *onion_type_name(int e UNNEEDED) { fprintf(stderr, "onion_type_name called!\n"); abort(); } diff --git a/gossipd/test/run-overlong.c b/gossipd/test/run-overlong.c index c136e4ede..9c383f171 100644 --- a/gossipd/test/run-overlong.c +++ b/gossipd/test/run-overlong.c @@ -38,6 +38,9 @@ bool nannounce_different(struct gossip_store *gs UNNEEDED, const struct node *node UNNEEDED, const u8 *nannounce UNNEEDED) { fprintf(stderr, "nannounce_different called!\n"); abort(); } +/* Generated stub for notleak_ */ +void *notleak_(const void *ptr UNNEEDED, bool plus_children UNNEEDED) +{ fprintf(stderr, "notleak_ called!\n"); abort(); } /* Generated stub for onion_type_name */ const char *onion_type_name(int e UNNEEDED) { fprintf(stderr, "onion_type_name called!\n"); abort(); } diff --git a/gossipd/test/run-txout_failure.c b/gossipd/test/run-txout_failure.c index 513480760..a082e7f29 100644 --- a/gossipd/test/run-txout_failure.c +++ b/gossipd/test/run-txout_failure.c @@ -50,6 +50,9 @@ bool nannounce_different(struct gossip_store *gs UNNEEDED, const struct node *node UNNEEDED, const u8 *nannounce UNNEEDED) { fprintf(stderr, "nannounce_different called!\n"); abort(); } +/* Generated stub for notleak_ */ +void *notleak_(const void *ptr UNNEEDED, bool plus_children UNNEEDED) +{ fprintf(stderr, "notleak_ called!\n"); abort(); } /* Generated stub for onion_type_name */ const char *onion_type_name(int e UNNEEDED) { fprintf(stderr, "onion_type_name called!\n"); abort(); }