From 9cff125590a30328660db9abacb6de1c524ca8c3 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 18 Jul 2022 21:42:27 +0930 Subject: [PATCH] common/gossip_store: fix leak on partial read. Very unusual, but it can happen, and we don't free: ``` lightningd-1 2022-07-12T04:21:22.591Z DEBUG gossipd: REPLY WIRE_GOSSIPD_DEV_MEMLEAK_REPLY with 0 fds lightningd-1 2022-07-12T04:21:22.645Z **BROKEN** connectd: MEMLEAK: 0x55e73123d008 lightningd-1 2022-07-12T04:21:22.645Z **BROKEN** connectd: label=common/gossip_store.c:92:u8[] lightningd-1 2022-07-12T04:21:22.645Z **BROKEN** connectd: backtrace: lightningd-1 2022-07-12T04:21:22.645Z **BROKEN** connectd: ccan/ccan/tal/tal.c:442 (tal_alloc_) lightningd-1 2022-07-12T04:21:22.645Z **BROKEN** connectd: ccan/ccan/tal/tal.c:471 (tal_alloc_arr_) lightningd-1 2022-07-12T04:21:22.645Z **BROKEN** connectd: common/gossip_store.c:92 (gossip_store_next) lightningd-1 2022-07-12T04:21:22.645Z **BROKEN** connectd: connectd/multiplex.c:433 (maybe_from_gossip_store) lightningd-1 2022-07-12T04:21:22.645Z **BROKEN** connectd: connectd/multiplex.c:856 (write_to_peer) lightningd-1 2022-07-12T04:21:22.646Z **BROKEN** connectd: ccan/ccan/io/io.c:59 (next_plan) lightningd-1 2022-07-12T04:21:22.646Z **BROKEN** connectd: ccan/ccan/io/io.c:407 (do_plan) lightningd-1 2022-07-12T04:21:22.646Z **BROKEN** connectd: ccan/ccan/io/io.c:423 (io_ready) lightningd-1 2022-07-12T04:21:22.646Z **BROKEN** connectd: ccan/ccan/io/poll.c:453 (io_loop) lightningd-1 2022-07-12T04:21:22.646Z **BROKEN** connectd: connectd/connectd.c:2083 (main) lightningd-1 2022-07-12T04:21:22.646Z **BROKEN** connectd: ../sysdeps/nptl/libc_start_call_main.h:58 (__libc_start_call_main) lightningd-1 2022-07-12T04:21:22.646Z **BROKEN** connectd: ../csu/libc-start.c:392 (__libc_start_main_impl) lightningd-1 2022-07-12T04:21:22.646Z **BROKEN** connectd: parents: ``` --- common/gossip_store.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/gossip_store.c b/common/gossip_store.c index c4f167a3d..2522904e3 100644 --- a/common/gossip_store.c +++ b/common/gossip_store.c @@ -150,7 +150,7 @@ u8 *gossip_store_next(const tal_t *ctx, msg = tal_arr(ctx, u8, msglen); r = pread(*gossip_store_fd, msg, msglen, *off + r); if (r != msglen) - return NULL; + return tal_free(msg); if (checksum != crc32c(be32_to_cpu(hdr.timestamp), msg, msglen)) status_failed(STATUS_FAIL_INTERNAL_ERROR,