int main ()
{
+ // Create a new file descriptor that we immediately close.
+ // This is of course fine.
int fd = dup (2);
if (fd != -1){
fprintf(stderr, "close fd %d\n", fd);
}
// Shouldn't warn, we are closing everything
+ // This is a special case for close_range if the last
+ // argument is ~0U (infinity).
fprintf(stderr, "Closing range (%d, %d).\n", fd, ~0U);
- close_range(6, ~0U, 0);
+ close_range(fd, ~0U, 0);
- // Should warn, we close a small range (but only for fd itself
- fprintf(stderr, "Closing range (%d, %d).\n", fd, 7);
+ int fd5 = dup2(1, 5);
+ int fd7 = dup2(2, 7);
+ fprintf(stderr, "Closing range (%d, %d).\n", fd5, fd7);
+ close_range(5, 7, 0);
+
+ // Should warn, we close a small range
+ fprintf(stderr, "Double closing range (%d, %d).\n", fd5, fd7);
close_range(5, 7, 0);
return 0;
close fd 3
Closing range (3, -1).
-Closing range (3, 7).
+Closing range (5, 7).
+Double closing range (5, 7).
+File descriptor ...: ... is already closed
+ at 0x........: close_range (in /...libc...)
+ by 0x........: main
+ Previously closed
+ at 0x........: close_range (in /...libc...)
+ by 0x........: main
+ Originally opened
+ at 0x........: dup2 (in /...libc...)
+ by 0x........: main
+File descriptor ...: ... is already closed
+ at 0x........: close_range (in /...libc...)
+ by 0x........: main
+ Previously closed
+ at 0x........: close_range (in /...libc...)
+ by 0x........: main
+ Originally opened
+ at 0x........: dup2 (in /...libc...)
+ by 0x........: main
prog: double_close_range
prereq: test -x double_close_range
+stderr_filter: filter_fdleak
vgopts: -q --track-fds=yes
-File descriptor 4: AF_INET socket 4: 127.0.0.1:... <-> 127.0.0.1:... is already closed
+File descriptor ...: ... is already closed
at 0x........: close (in /...libc...)
by 0x........: client (fdleak_ipv4.c:70)
by 0x........: main
close 3
time passes and we close 3 again
-File descriptor 3: file_dclose.tmp is already closed
+File descriptor ...: ... is already closed
at 0x........: close (in /...libc...)
by 0x........: closefile (file_dclose.c:17)
by 0x........: main
perl -p -e 's/^Open (AF_UNIX socket|file descriptor) [0-9]*: (\/private)?\/tmp\/(sock|data1|data2|file)\.[0-9]*/Open $1 ...: \/tmp\/$3/' |
perl -p -e 's/^Open file descriptor [0-9]*: .*/Open file descriptor ...: .../' |
perl -p -e 's/^Open file descriptor [0-9]*:$/Open file descriptor ...:/' |
+perl -p -e 's/File descriptor [0-9]*: .* is already closed/File descriptor ...: ... is already closed/' |
perl -p -e 's/127.0.0.1:[0-9]*/127.0.0.1:.../g' |
perl -p -e 's/socket\.c:[1-9][0-9]*/in \/...libc.../' |
# arm systems substitute open for creat
sed "s/by 0x........: (below main)/by 0x........: main/" |
sed "s/by 0x........: main (.*)/by 0x........: main/" |
-# With glibc debuginfo installed we might see syscall-template.S, close.c or creat64.c
+# With glibc debuginfo installed we might see syscall-template.S,
+# dup2.c close.c or creat64.c
perl -p -e "s/\(syscall-template.S:[0-9]*\)/(in \/...libc...)/" |
perl -p -e "s/\(close.c:[0-9]*\)/(in \/...libc...)/" |
-perl -p -e "s/\(creat(?:64)?.c:[0-9]*\)/(in \/...libc...)/"
+perl -p -e "s/\(creat(?:64)?.c:[0-9]*\)/(in \/...libc...)/" |
+perl -p -e "s/\(dup2.c:[0-9]*\)/(in \/...libc...)/"
Open socket 3
close socket_fd 3
and close the socket again 3
-File descriptor 3: AF_UNIX socket 3: /tmp/vgtest-foofrob is already closed
+File descriptor ...: ... is already closed
at 0x........: close (in /...libc...)
by 0x........: main
Previously closed