[dovecot-cvs] dovecot/src/lib fd-close-on-exec.c,1.3,1.4

cras at procontrol.fi cras at procontrol.fi
Tue Mar 4 05:59:16 EET 2003


Update of /home/cvs/dovecot/src/lib
In directory danu:/tmp/cvs-serv22478/lib

Modified Files:
	fd-close-on-exec.c 
Log Message:
More verbose error message when leaked fd is noticed.



Index: fd-close-on-exec.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib/fd-close-on-exec.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- fd-close-on-exec.c	6 Feb 2003 02:31:31 -0000	1.3
+++ fd-close-on-exec.c	4 Mar 2003 03:59:13 -0000	1.4
@@ -22,10 +22,13 @@
 */
 
 #include "lib.h"
+#include "network.h"
 #include "fd-close-on-exec.h"
 
 #include <unistd.h>
 #include <fcntl.h>
+#include <sys/stat.h>
+#include <sys/un.h>
 
 void fd_close_on_exec(int fd, int set)
 {
@@ -42,9 +45,47 @@
 
 void fd_debug_verify_leaks(int first_fd, int last_fd)
 {
+	struct ip_addr addr;
+	unsigned int port;
+	struct stat st;
+
 	while (first_fd < last_fd) {
-		if (fcntl(first_fd, F_GETFD, 0) != -1 || errno != EBADF)
-			i_panic("Leaked file descriptor: %d", first_fd);
+		if (fcntl(first_fd, F_GETFD, 0) != -1 || errno != EBADF) {
+			int old_errno = errno;
+
+			if (net_getsockname(first_fd, &addr, &port) == 0) {
+				if (addr.family == AF_UNIX) {
+					struct sockaddr_un sa;
+					socklen_t socklen = sizeof(sa);
+
+					if (getsockname(first_fd,
+							(struct sockaddr *) &sa,
+							&socklen) < 0)
+						sa.sun_path[0] = '\0';
+
+					i_panic("Leaked UNIX socket fd %d: %s",
+						first_fd, sa.sun_path);
+				}
+
+				i_panic("Leaked socket fd %d: %s:%u",
+					first_fd, net_ip2host(&addr), port);
+			}
+
+			if (fstat(first_fd, &st) == 0) {
+#ifdef HAVE_SYS_SYSMACROS_H
+				i_panic("Leaked file fd %d: dev %u.%u inode %s",
+					first_fd, major(st.st_dev),
+					minor(st.st_dev), dec2str(st.st_ino));
+#else
+				i_panic("Leaked file fd %d: dev %s inode %s",
+					first_fd, dec2str(st.st_dev),
+					dec2str(st.st_ino));
+#endif
+			}
+
+			i_panic("Leaked unknown fd %d (errno = %s)",
+				first_fd, strerror(old_errno));
+		}
 		first_fd++;
 	}
 }




More information about the dovecot-cvs mailing list