From 07c4d39b7597177d79dba9f799414425506d893b Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Wed, 23 Mar 2022 09:31:36 +1030 Subject: [PATCH] memleak: fix double-free if we timeout. ... and then dualopend returns, and we access the fread leak_detect struct. ``` lightningd: FATAL SIGNAL 6 (version 065ca1e) 0x55ecd4be8145 send_backtrace common/daemon.c:33 0x55ecd4be81f1 crashdump common/daemon.c:46 0x7f200acab51f ??? ./signal/../sysdeps/unix/sysv/linux/x86_64/libc_sigaction.c:0 0x7f200acff828 __pthread_kill_implementation ./nptl/pthread_kill.c:44 0x7f200acff828 __pthread_kill_internal ./nptl/pthread_kill.c:80 0x7f200acff828 __GI___pthread_kill ./nptl/pthread_kill.c:91 0x7f200acab475 __GI_raise ../sysdeps/posix/raise.c:26 0x7f200ac917b6 __GI_abort ./stdlib/abort.c:79 0x55ecd4c6827f call_error ccan/ccan/tal/tal.c:93 0x55ecd4c68470 check_bounds ccan/ccan/tal/tal.c:165 0x55ecd4c684c2 to_tal_hdr ccan/ccan/tal/tal.c:175 0x55ecd4c68eb8 tal_free ccan/ccan/tal/tal.c:479 0x55ecd4b8bdd0 finish_report lightningd/memdump.c:138 0x55ecd4b8c115 leak_detect_req_done lightningd/memdump.c:201 0x55ecd4c68664 notify ccan/ccan/tal/tal.c:237 0x55ecd4c68b9e del_tree ccan/ccan/tal/tal.c:402 0x55ecd4c68bf3 del_tree ccan/ccan/tal/tal.c:412 0x55ecd4c68bf3 del_tree ccan/ccan/tal/tal.c:412 0x55ecd4c68f43 tal_free ccan/ccan/tal/tal.c:486 0x55ecd4c5751f io_close ccan/ccan/io/io.c:450 0x55ecd4bbce68 subd_shutdown_remaining lightningd/subd.c:911 0x55ecd4b8724a shutdown_subdaemons lightningd/lightningd.c:541 0x55ecd4b883cc main lightningd/lightningd.c:1207 0x7f200ac92fcf __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58 0x7f200ac9307c __libc_start_main_impl ../csu/libc-start.c:409 0x55ecd4b5cc54 ??? ``` Signed-off-by: Rusty Russell --- lightningd/memdump.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lightningd/memdump.c b/lightningd/memdump.c index 226341a90..952355bf8 100644 --- a/lightningd/memdump.c +++ b/lightningd/memdump.c @@ -189,6 +189,9 @@ static void finish_report(const struct leak_detect *leaks) static void leak_detect_timeout(struct leak_detect *leak_detect) { + /* We actually *do* leak the leak_detect, but cmd is about + * to exit. */ + notleak(tal_steal(NULL, leak_detect)); finish_report(leak_detect); leak_detect->cmd = NULL; }