Mercurial > dovecot > core-2.2
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 |
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 } |