From aa13a20cb0553f6cc744bc67d6db18dbd28edac5 Mon Sep 17 00:00:00 2001 From: mrkmntal Date: Sat, 29 Aug 2026 14:26:26 -0400 Subject: [PATCH] Add proc traversal debugging for tracking down ARM 64 asm bugs in tuxreaperd --- tuxreaperdasm.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/tuxreaperdasm.c b/tuxreaperdasm.c index ed99f30..5124c3b 100644 --- a/tuxreaperdasm.c +++ b/tuxreaperdasm.c @@ -668,6 +668,11 @@ static long parse_pid(const char *s) { Skip PID 1 (the reaper itself). */ static void proc_remap_signal(int in_sig, int out_sig, const char *const *target_exes) { int procfd = (int)sys_openat(AT_FDCWD, "/proc", O_RDONLY | O_DIRECTORY, 0); +#ifdef TUXREAPERD_DEBUG + debug_write("[tuxreaperd] proc_remap_signal openat fd="); + debug_write_int(procfd); + debug_write("\n"); +#endif if (procfd < 0) { debug_msg("opendir(/proc) failed"); return; @@ -677,6 +682,11 @@ static void proc_remap_signal(int in_sig, int out_sig, const char *const *target for (;;) { long n = sys_getdents64(procfd, dirbuf, sizeof(dirbuf)); +#ifdef TUXREAPERD_DEBUG + debug_write("[tuxreaperd] proc_remap getdents64 n="); + debug_write_int(n); + debug_write("\n"); +#endif if (n <= 0) break; for (long pos = 0; pos < n;) { @@ -701,6 +711,15 @@ static void proc_remap_signal(int in_sig, int out_sig, const char *const *target char linkbuf[256]; long linklen = sys_readlink(path, linkbuf, sizeof(linkbuf) - 1); +#ifdef TUXREAPERD_DEBUG + debug_write("[tuxreaperd] proc_remap pid="); + debug_write_int(pid); + debug_write(" path="); + debug_write(path); + debug_write(" linklen="); + debug_write_int(linklen); + debug_write("\n"); +#endif if (linklen <= 0) continue; linkbuf[linklen] = '\0'; @@ -754,6 +773,13 @@ static void broadcast_signal(int in_sig, int out_sig, const char *const *target_ static int count_descendants(void) { int procfd = (int)sys_openat(AT_FDCWD, "/proc", O_RDONLY | O_DIRECTORY, 0); +#ifdef TUXREAPERD_DEBUG + debug_write("[tuxreaperd] count_descendants openat fd="); + debug_write_int(procfd); + debug_write(" flags=0x"); + debug_write_int(O_RDONLY | O_DIRECTORY); + debug_write("\n"); +#endif if (procfd < 0) return 0; int count = 0; @@ -761,6 +787,11 @@ static int count_descendants(void) { for (;;) { long n = sys_getdents64(procfd, dirbuf, sizeof(dirbuf)); +#ifdef TUXREAPERD_DEBUG + debug_write("[tuxreaperd] getdents64 n="); + debug_write_int(n); + debug_write("\n"); +#endif if (n <= 0) break; for (long pos = 0; pos < n;) { @@ -768,6 +799,15 @@ static int count_descendants(void) { pos += de->d_reclen; const char *name = de->d_name; +#ifdef TUXREAPERD_DEBUG + debug_write("[tuxreaperd] dirent name="); + debug_write(name); + debug_write(" reclen="); + debug_write_int(de->d_reclen); + debug_write(" d_type="); + debug_write_int(de->d_type); + debug_write("\n"); +#endif if (name[0] == '.') continue; long pid = parse_pid(name);