From ebf487ef03e36850182e372912a41841838921b4 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Tue, 20 Nov 2018 17:32:02 +0000 Subject: [PATCH] dbus-spawn-unix: If a fd is not close-on-exec, look it up in /proc/self/fd In operating systems where /proc/self/fd works like it does on Linux (Linux itself, and FreeBSD with Linux /proc emulation) this will give us a clue about the fd that was leaked or opened incorrectly. Signed-off-by: Simon McVittie --- dbus/dbus-spawn-unix.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/dbus/dbus-spawn-unix.c b/dbus/dbus-spawn-unix.c index cea5a5f10..b6a4acd53 100644 --- a/dbus/dbus-spawn-unix.c +++ b/dbus/dbus-spawn-unix.c @@ -1063,7 +1063,22 @@ do_exec (int child_err_report_fd, retval = fcntl (i, F_GETFD); if (retval != -1 && !(retval & FD_CLOEXEC)) - _dbus_warn ("Fd %d did not have the close-on-exec flag set!", i); + { + char description[256] = { 0 }; + char proc_self_fd[256] = { 0 }; + size_t description_length = sizeof (description) - 1; + + snprintf (proc_self_fd, sizeof (proc_self_fd) - 1, + "/proc/self/fd/%d", i); + proc_self_fd[sizeof (proc_self_fd) - 1] = '\0'; + + if (readlink (proc_self_fd, description, description_length) <= 0) + snprintf (description, sizeof (description) - 1, "(unknown)"); + + description[sizeof (description) - 1] = '\0'; + _dbus_warn ("Fd %d \"%s\" did not have the close-on-exec flag set!", + i, description); + } } #endif -- 2.47.3