annotate src/lib/fd-close-on-exec.c @ 23007:36e01285b5b8

lib: buffer - Improve header comment for buffer_insert() and buffer_delete().
author Stephan Bosch <stephan.bosch@dovecot.fi>
date Mon, 18 Mar 2019 00:52:37 +0100
parents cb108f786fb4
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
22713
cb108f786fb4 Updated copyright notices to include the year 2018.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
1 /* Copyright (c) 2002-2018 Dovecot authors, see the included COPYING file */
727
8dd8ebe6bcac We use close-on-exec flag now to make sure that master process closes the
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
8dd8ebe6bcac We use close-on-exec flag now to make sure that master process closes the
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
15187
02451e967a06 Renamed network.[ch] to net.[ch].
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
4 #include "net.h"
727
8dd8ebe6bcac We use close-on-exec flag now to make sure that master process closes the
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "fd-close-on-exec.h"
8dd8ebe6bcac We use close-on-exec flag now to make sure that master process closes the
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6
8dd8ebe6bcac We use close-on-exec flag now to make sure that master process closes the
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include <unistd.h>
8dd8ebe6bcac We use close-on-exec flag now to make sure that master process closes the
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include <fcntl.h>
1269
dad400966e72 More verbose error message when leaked fd is noticed.
Timo Sirainen <tss@iki.fi>
parents: 1098
diff changeset
9 #include <sys/stat.h>
dad400966e72 More verbose error message when leaked fd is noticed.
Timo Sirainen <tss@iki.fi>
parents: 1098
diff changeset
10 #include <sys/un.h>
727
8dd8ebe6bcac We use close-on-exec flag now to make sure that master process closes the
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 2183
diff changeset
12 void fd_close_on_exec(int fd, bool set)
727
8dd8ebe6bcac We use close-on-exec flag now to make sure that master process closes the
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 {
8dd8ebe6bcac We use close-on-exec flag now to make sure that master process closes the
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 int flags;
8dd8ebe6bcac We use close-on-exec flag now to make sure that master process closes the
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15
8dd8ebe6bcac We use close-on-exec flag now to make sure that master process closes the
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 flags = fcntl(fd, F_GETFD, 0);
8dd8ebe6bcac We use close-on-exec flag now to make sure that master process closes the
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 if (flags < 0)
1098
5a60e173fe9a Print also the fd number if it fails.
Timo Sirainen <tss@iki.fi>
parents: 730
diff changeset
18 i_fatal("fcntl(F_GETFD, %d) failed: %m", fd);
727
8dd8ebe6bcac We use close-on-exec flag now to make sure that master process closes the
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19
8dd8ebe6bcac We use close-on-exec flag now to make sure that master process closes the
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 flags = set ? (flags | FD_CLOEXEC) : (flags & ~FD_CLOEXEC);
8dd8ebe6bcac We use close-on-exec flag now to make sure that master process closes the
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 if (fcntl(fd, F_SETFD, flags) < 0)
1098
5a60e173fe9a Print also the fd number if it fails.
Timo Sirainen <tss@iki.fi>
parents: 730
diff changeset
22 i_fatal("fcntl(F_SETFD, %d) failed: %m", fd);
727
8dd8ebe6bcac We use close-on-exec flag now to make sure that master process closes the
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 }
8dd8ebe6bcac We use close-on-exec flag now to make sure that master process closes the
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24
8dd8ebe6bcac We use close-on-exec flag now to make sure that master process closes the
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 void fd_debug_verify_leaks(int first_fd, int last_fd)
8dd8ebe6bcac We use close-on-exec flag now to make sure that master process closes the
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 {
2183
1b0153eb3fa5 if socket is leaked, show also the remote side of it
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
27 struct ip_addr addr, raddr;
19035
aabfe48db1cf Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
28 in_port_t port, rport;
1269
dad400966e72 More verbose error message when leaked fd is noticed.
Timo Sirainen <tss@iki.fi>
parents: 1098
diff changeset
29 struct stat st;
4978
8d2efdb73816 debug: OSX leaks an fd from gettimeofday(), ignore it.
Timo Sirainen <tss@iki.fi>
parents: 4018
diff changeset
30 int old_errno;
1269
dad400966e72 More verbose error message when leaked fd is noticed.
Timo Sirainen <tss@iki.fi>
parents: 1098
diff changeset
31
9947
4169c35b6285 fd_debug_verify_leaks() didn't check the last_fd.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
32 for (; first_fd <= last_fd; first_fd++) {
4978
8d2efdb73816 debug: OSX leaks an fd from gettimeofday(), ignore it.
Timo Sirainen <tss@iki.fi>
parents: 4018
diff changeset
33 if (fcntl(first_fd, F_GETFD, 0) == -1 && errno == EBADF)
8d2efdb73816 debug: OSX leaks an fd from gettimeofday(), ignore it.
Timo Sirainen <tss@iki.fi>
parents: 4018
diff changeset
34 continue;
8d2efdb73816 debug: OSX leaks an fd from gettimeofday(), ignore it.
Timo Sirainen <tss@iki.fi>
parents: 4018
diff changeset
35
8d2efdb73816 debug: OSX leaks an fd from gettimeofday(), ignore it.
Timo Sirainen <tss@iki.fi>
parents: 4018
diff changeset
36 old_errno = errno;
1269
dad400966e72 More verbose error message when leaked fd is noticed.
Timo Sirainen <tss@iki.fi>
parents: 1098
diff changeset
37
4978
8d2efdb73816 debug: OSX leaks an fd from gettimeofday(), ignore it.
Timo Sirainen <tss@iki.fi>
parents: 4018
diff changeset
38 if (net_getsockname(first_fd, &addr, &port) == 0) {
8d2efdb73816 debug: OSX leaks an fd from gettimeofday(), ignore it.
Timo Sirainen <tss@iki.fi>
parents: 4018
diff changeset
39 if (addr.family == AF_UNIX) {
8d2efdb73816 debug: OSX leaks an fd from gettimeofday(), ignore it.
Timo Sirainen <tss@iki.fi>
parents: 4018
diff changeset
40 struct sockaddr_un sa;
1269
dad400966e72 More verbose error message when leaked fd is noticed.
Timo Sirainen <tss@iki.fi>
parents: 1098
diff changeset
41
4978
8d2efdb73816 debug: OSX leaks an fd from gettimeofday(), ignore it.
Timo Sirainen <tss@iki.fi>
parents: 4018
diff changeset
42 socklen_t socklen = sizeof(sa);
1269
dad400966e72 More verbose error message when leaked fd is noticed.
Timo Sirainen <tss@iki.fi>
parents: 1098
diff changeset
43
4978
8d2efdb73816 debug: OSX leaks an fd from gettimeofday(), ignore it.
Timo Sirainen <tss@iki.fi>
parents: 4018
diff changeset
44 if (getsockname(first_fd, (void *)&sa,
8d2efdb73816 debug: OSX leaks an fd from gettimeofday(), ignore it.
Timo Sirainen <tss@iki.fi>
parents: 4018
diff changeset
45 &socklen) < 0)
8d2efdb73816 debug: OSX leaks an fd from gettimeofday(), ignore it.
Timo Sirainen <tss@iki.fi>
parents: 4018
diff changeset
46 sa.sun_path[0] = '\0';
8d2efdb73816 debug: OSX leaks an fd from gettimeofday(), ignore it.
Timo Sirainen <tss@iki.fi>
parents: 4018
diff changeset
47
8d2efdb73816 debug: OSX leaks an fd from gettimeofday(), ignore it.
Timo Sirainen <tss@iki.fi>
parents: 4018
diff changeset
48 i_panic("Leaked UNIX socket fd %d: %s",
8d2efdb73816 debug: OSX leaks an fd from gettimeofday(), ignore it.
Timo Sirainen <tss@iki.fi>
parents: 4018
diff changeset
49 first_fd, sa.sun_path);
1269
dad400966e72 More verbose error message when leaked fd is noticed.
Timo Sirainen <tss@iki.fi>
parents: 1098
diff changeset
50 }
dad400966e72 More verbose error message when leaked fd is noticed.
Timo Sirainen <tss@iki.fi>
parents: 1098
diff changeset
51
4978
8d2efdb73816 debug: OSX leaks an fd from gettimeofday(), ignore it.
Timo Sirainen <tss@iki.fi>
parents: 4018
diff changeset
52 if (net_getpeername(first_fd, &raddr, &rport) < 0) {
21389
59437f8764c6 global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 19552
diff changeset
53 i_zero(&raddr);
4978
8d2efdb73816 debug: OSX leaks an fd from gettimeofday(), ignore it.
Timo Sirainen <tss@iki.fi>
parents: 4018
diff changeset
54 rport = 0;
8d2efdb73816 debug: OSX leaks an fd from gettimeofday(), ignore it.
Timo Sirainen <tss@iki.fi>
parents: 4018
diff changeset
55 }
8d2efdb73816 debug: OSX leaks an fd from gettimeofday(), ignore it.
Timo Sirainen <tss@iki.fi>
parents: 4018
diff changeset
56 i_panic("Leaked socket fd %d: %s:%u -> %s:%u",
8d2efdb73816 debug: OSX leaks an fd from gettimeofday(), ignore it.
Timo Sirainen <tss@iki.fi>
parents: 4018
diff changeset
57 first_fd, net_ip2addr(&addr), port,
8d2efdb73816 debug: OSX leaks an fd from gettimeofday(), ignore it.
Timo Sirainen <tss@iki.fi>
parents: 4018
diff changeset
58 net_ip2addr(&raddr), rport);
8d2efdb73816 debug: OSX leaks an fd from gettimeofday(), ignore it.
Timo Sirainen <tss@iki.fi>
parents: 4018
diff changeset
59 }
8d2efdb73816 debug: OSX leaks an fd from gettimeofday(), ignore it.
Timo Sirainen <tss@iki.fi>
parents: 4018
diff changeset
60
8d2efdb73816 debug: OSX leaks an fd from gettimeofday(), ignore it.
Timo Sirainen <tss@iki.fi>
parents: 4018
diff changeset
61 if (fstat(first_fd, &st) == 0) {
8d2efdb73816 debug: OSX leaks an fd from gettimeofday(), ignore it.
Timo Sirainen <tss@iki.fi>
parents: 4018
diff changeset
62 #ifdef __APPLE__
8d2efdb73816 debug: OSX leaks an fd from gettimeofday(), ignore it.
Timo Sirainen <tss@iki.fi>
parents: 4018
diff changeset
63 /* OSX workaround: gettimeofday() calls shm_open()
8d2efdb73816 debug: OSX leaks an fd from gettimeofday(), ignore it.
Timo Sirainen <tss@iki.fi>
parents: 4018
diff changeset
64 internally and the fd won't get closed on exec.
8d2efdb73816 debug: OSX leaks an fd from gettimeofday(), ignore it.
Timo Sirainen <tss@iki.fi>
parents: 4018
diff changeset
65 We'll just skip all ino/dev=0 files and hope they
8d2efdb73816 debug: OSX leaks an fd from gettimeofday(), ignore it.
Timo Sirainen <tss@iki.fi>
parents: 4018
diff changeset
66 weren't anything else. */
8d2efdb73816 debug: OSX leaks an fd from gettimeofday(), ignore it.
Timo Sirainen <tss@iki.fi>
parents: 4018
diff changeset
67 if (st.st_ino == 0 && st.st_dev == 0)
8d2efdb73816 debug: OSX leaks an fd from gettimeofday(), ignore it.
Timo Sirainen <tss@iki.fi>
parents: 4018
diff changeset
68 continue;
8d2efdb73816 debug: OSX leaks an fd from gettimeofday(), ignore it.
Timo Sirainen <tss@iki.fi>
parents: 4018
diff changeset
69 #endif
1269
dad400966e72 More verbose error message when leaked fd is noticed.
Timo Sirainen <tss@iki.fi>
parents: 1098
diff changeset
70 #ifdef HAVE_SYS_SYSMACROS_H
4978
8d2efdb73816 debug: OSX leaks an fd from gettimeofday(), ignore it.
Timo Sirainen <tss@iki.fi>
parents: 4018
diff changeset
71 i_panic("Leaked file fd %d: dev %s.%s inode %s",
8d2efdb73816 debug: OSX leaks an fd from gettimeofday(), ignore it.
Timo Sirainen <tss@iki.fi>
parents: 4018
diff changeset
72 first_fd, dec2str(major(st.st_dev)),
8d2efdb73816 debug: OSX leaks an fd from gettimeofday(), ignore it.
Timo Sirainen <tss@iki.fi>
parents: 4018
diff changeset
73 dec2str(minor(st.st_dev)), dec2str(st.st_ino));
1269
dad400966e72 More verbose error message when leaked fd is noticed.
Timo Sirainen <tss@iki.fi>
parents: 1098
diff changeset
74 #else
4978
8d2efdb73816 debug: OSX leaks an fd from gettimeofday(), ignore it.
Timo Sirainen <tss@iki.fi>
parents: 4018
diff changeset
75 i_panic("Leaked file fd %d: dev %s inode %s",
8d2efdb73816 debug: OSX leaks an fd from gettimeofday(), ignore it.
Timo Sirainen <tss@iki.fi>
parents: 4018
diff changeset
76 first_fd, dec2str(st.st_dev),
8d2efdb73816 debug: OSX leaks an fd from gettimeofday(), ignore it.
Timo Sirainen <tss@iki.fi>
parents: 4018
diff changeset
77 dec2str(st.st_ino));
1269
dad400966e72 More verbose error message when leaked fd is noticed.
Timo Sirainen <tss@iki.fi>
parents: 1098
diff changeset
78 #endif
4978
8d2efdb73816 debug: OSX leaks an fd from gettimeofday(), ignore it.
Timo Sirainen <tss@iki.fi>
parents: 4018
diff changeset
79 }
1269
dad400966e72 More verbose error message when leaked fd is noticed.
Timo Sirainen <tss@iki.fi>
parents: 1098
diff changeset
80
4978
8d2efdb73816 debug: OSX leaks an fd from gettimeofday(), ignore it.
Timo Sirainen <tss@iki.fi>
parents: 4018
diff changeset
81 i_panic("Leaked unknown fd %d (errno = %s)",
8d2efdb73816 debug: OSX leaks an fd from gettimeofday(), ignore it.
Timo Sirainen <tss@iki.fi>
parents: 4018
diff changeset
82 first_fd, strerror(old_errno));
727
8dd8ebe6bcac We use close-on-exec flag now to make sure that master process closes the
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83 }
8dd8ebe6bcac We use close-on-exec flag now to make sure that master process closes the
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84 }