]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: fd-util - Try to read link from procfs to see which file leaked
authorAki Tuomi <aki.tuomi@open-xchange.com>
Mon, 13 Mar 2023 12:07:00 +0000 (14:07 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Tue, 21 Mar 2023 19:17:43 +0000 (19:17 +0000)
Makes it easier to determine why the leak occured.

src/lib/fd-util.c

index 01315bc417222352ffadcbd287a9f8e7f34b4023..e5b689c4c12bd904160f4d2b1a5d844093b9ecb7 100644 (file)
@@ -2,6 +2,7 @@
 
 #include "lib.h"
 #include "net.h"
+#include "path-util.h"
 
 #include <unistd.h>
 #include <fcntl.h>
@@ -63,6 +64,12 @@ void fd_debug_verify_leaks(int first_fd, int last_fd)
                }
 
                if (fstat(fd, &st) == 0) {
+                       const char *error;
+                       const char *fname;
+                       if (t_readlink(t_strdup_printf("/proc/self/fd/%d", fd),
+                                      &fname, &error) < 0)
+                               fname = t_strdup_printf("<error: %s>", error);
+
 #ifdef __APPLE__
                        /* OSX workaround: gettimeofday() calls shm_open()
                           internally and the fd won't get closed on exec.
@@ -72,14 +79,14 @@ void fd_debug_verify_leaks(int first_fd, int last_fd)
                                continue;
 #endif
 #ifdef HAVE_SYS_SYSMACROS_H
-                       i_error("Leaked file fd %d: dev %s.%s inode %s",
-                               fd, dec2str(major(st.st_dev)),
+                       i_error("Leaked file %s: fd %d dev %s.%s inode %s",
+                               fname, fd, dec2str(major(st.st_dev)),
                                dec2str(minor(st.st_dev)), dec2str(st.st_ino));
                        leaks = TRUE;
                        continue;
 #else
-                       i_error("Leaked file fd %d: dev %s inode %s",
-                               fd, dec2str(st.st_dev),
+                       i_error("Leaked file %s: fd %d dev %s inode %s",
+                               fname, fd, dec2str(st.st_dev),
                                dec2str(st.st_ino));
                        leaks = TRUE;
                        continue;