Skip to content

Commit 1f05063

Browse files
rustyrussellendothermicdev
authored andcommitted
lightningd: allow bitcoind_getrawblockbyheight callback to free call struct.
Use the indirect-free trick, otherwise this can happen: ``` 2025-03-28T10:46:16.437Z BROKEN lightningd: FATAL SIGNAL 6 (version v25.02) 2025-03-28T10:46:16.437Z BROKEN lightningd: backtrace: common/daemon.c:41 (send_backtrace) 0x6447525af68c 2025-03-28T10:46:16.437Z BROKEN lightningd: backtrace: common/daemon.c:78 (crashdump) 0x6447525af6db 2025-03-28T10:46:16.437Z BROKEN lightningd: backtrace: ./signal/../sysdeps/unix/sysv/linux/x86_64/libc_sigaction.c:0 ((null)) 0x7783e2c4532f 2025-03-28T10:46:16.437Z BROKEN lightningd: backtrace: ./nptl/pthread_kill.c:44 (__pthread_kill_implementation) 0x7783e2c9eb2c 2025-03-28T10:46:16.437Z BROKEN lightningd: backtrace: ./nptl/pthread_kill.c:78 (__pthread_kill_internal) 0x7783e2c9eb2c 2025-03-28T10:46:16.437Z BROKEN lightningd: backtrace: ./nptl/pthread_kill.c:89 (__GI___pthread_kill) 0x7783e2c9eb2c 2025-03-28T10:46:16.437Z BROKEN lightningd: backtrace: ../sysdeps/posix/raise.c:26 (__GI_raise) 0x7783e2c4527d 2025-03-28T10:46:16.437Z BROKEN lightningd: backtrace: ./stdlib/abort.c:79 (__GI_abort) 0x7783e2c288fe 2025-03-28T10:46:16.437Z BROKEN lightningd: backtrace: ccan/ccan/tal/tal.c:95 (call_error) 0x644752675535 2025-03-28T10:46:16.437Z BROKEN lightningd: backtrace: ccan/ccan/tal/tal.c:169 (check_bounds) 0x6447526755de 2025-03-28T10:46:16.437Z BROKEN lightningd: backtrace: ccan/ccan/tal/tal.c:180 (to_tal_hdr) 0x644752675618 2025-03-28T10:46:16.437Z BROKEN lightningd: backtrace: ccan/ccan/tal/tal.c:525 (tal_free) 0x644752676001 2025-03-28T10:46:16.437Z BROKEN lightningd: backtrace: lightningd/bitcoind.c:509 (getrawblockbyheight_callback) 0x64475252c01b 2025-03-28T10:46:16.437Z BROKEN lightningd: backtrace: lightningd/plugin.c:661 (plugin_response_handle) 0x64475257be0a ``` Changelog-Fixed: lightningd: occasional crash on bitcoind callback. Signed-off-by: Rusty Russell <[email protected]>
1 parent ee2ec8b commit 1f05063

File tree

1 file changed

+7
-1
lines changed

1 file changed

+7
-1
lines changed

lightningd/bitcoind.c

+7-1
Original file line numberDiff line numberDiff line change
@@ -477,9 +477,15 @@ getrawblockbyheight_callback(const char *buf, const jsmntok_t *toks,
477477
const char *block_str, *err;
478478
struct bitcoin_blkid blkid;
479479
struct bitcoin_block *blk;
480+
const tal_t *ctx;
480481
trace_span_resume(call);
481482
trace_span_end(call);
482483

484+
/* Callback may free parent of call, so steal onto context to
485+
* free if it doesn't */
486+
ctx = tal(NULL, char);
487+
tal_steal(ctx, call);
488+
483489
/* If block hash is `null`, this means not found! Call the callback
484490
* with NULL values. */
485491
err = json_scan(tmpctx, buf, toks, "{result:{blockhash:null}}");
@@ -506,7 +512,7 @@ getrawblockbyheight_callback(const char *buf, const jsmntok_t *toks,
506512
call->cb(call->bitcoind, call->height, &blkid, blk, call->cb_arg);
507513

508514
clean:
509-
tal_free(call);
515+
tal_free(ctx);
510516
}
511517

512518
void bitcoind_getrawblockbyheight_(const tal_t *ctx,

0 commit comments

Comments
 (0)