Skip to content

Commit 8a55301

Browse files
author
Mark Wielaard
committed
Check whether file descriptor is inherited before printing where_opened
Inherited file descriptors don't have an ExeContext where they were opened (by the program). So don't try to print the NULL where_opened when reporting double close errors for such file descriptors. Add a testcase none/tests/fdleak_doubleclose0 that crashes valgrind before this fix. https://bugs.kde.org/show_bug.cgi?id=504466 (cherry picked from commit 8187386)
1 parent 69b931e commit 8a55301

5 files changed

Lines changed: 36 additions & 5 deletions

File tree

coregrind/m_syswrap/syswrap-generic.c

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -637,7 +637,8 @@ struct BadCloseExtra {
637637
HChar *description; /* Description of the file descriptor
638638
might include the pathname */
639639
ExeContext *where_closed; /* record the last close of fd */
640-
ExeContext *where_opened; /* recordwhere the fd was opened */
640+
ExeContext *where_opened; /* recordwhere the fd was opened,
641+
NULL if inherited file descriptor */
641642
};
642643

643644
struct FdBadUse {
@@ -646,7 +647,8 @@ struct FdBadUse {
646647
HChar *description; /* Description of the file descriptor
647648
might include the pathname */
648649
ExeContext *where_closed; /* record the last close of fd */
649-
ExeContext *where_opened; /* recordwhere the fd was opened */
650+
ExeContext *where_opened; /* recordwhere the fd was opened,
651+
NULL if inherited file descriptor */
650652
};
651653

652654
struct NotClosedExtra {
@@ -1197,8 +1199,11 @@ void fd_pp_Error (const Error *err)
11971199
VG_(pp_ExeContext)( where );
11981200
VG_(emit)("%sPreviously closed%s\n", auxpre, auxpost);
11991201
VG_(pp_ExeContext)(bce->where_closed);
1200-
VG_(emit)("%sOriginally opened%s\n", auxpre, auxpost);
1201-
VG_(pp_ExeContext)(bce->where_opened);
1202+
// Inherited file descriptors where never opened (by the program)
1203+
if (bce->where_opened) {
1204+
VG_(emit)("%sOriginally opened%s\n", auxpre, auxpost);
1205+
VG_(pp_ExeContext)(bce->where_opened);
1206+
}
12021207
} else if (VG_(get_error_kind)(err) == FdNotClosed) {
12031208
if (xml) VG_(emit)(" <kind>FdNotClosed</kind>\n");
12041209
struct NotClosedExtra *nce = (struct NotClosedExtra *)

none/tests/Makefile.am

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ EXTRA_DIST = \
150150
fdleak_creat_xml.stderr.exp fdleak_creat_xml.vgtest \
151151
fdleak_creat_sup.stderr.exp fdleak_creat_sup.supp \
152152
fdleak_creat_sup.vgtest \
153+
fdleak_doubleclose0.stderr.exp fdleak_doubleclose0.vgtest \
153154
fdleak_dup.stderr.exp fdleak_dup.vgtest \
154155
fdleak_dup_xml.stderr.exp fdleak_dup_xml.vgtest \
155156
fdleak_dup2.stderr.exp fdleak_dup2.vgtest \
@@ -283,7 +284,7 @@ check_PROGRAMS = \
283284
bug492678 \
284285
closeall coolo_strlen \
285286
discard exec-sigmask execve faultstatus fcntl_setown \
286-
fdleak_cmsg fdleak_creat fdleak_dup fdleak_dup2 \
287+
fdleak_cmsg fdleak_creat fdleak_doubleclose0 fdleak_dup fdleak_dup2 \
287288
fdleak_fcntl fdleak_ipv4 fdleak_open fdleak_pipe \
288289
fdleak_socketpair \
289290
floored fork fucomip \

none/tests/fdleak_doubleclose0.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#include <unistd.h>
2+
3+
int main (int argc, char **argv)
4+
{
5+
close (0);
6+
close (1);
7+
close (1);
8+
close (0);
9+
return 0;
10+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
File descriptor ...: ... is already closed
2+
at 0x........: close (in /...libc...)
3+
by 0x........: main
4+
Previously closed
5+
at 0x........: close (in /...libc...)
6+
by 0x........: main
7+
File descriptor ...: ... is already closed
8+
at 0x........: close (in /...libc...)
9+
by 0x........: main
10+
Previously closed
11+
at 0x........: close (in /...libc...)
12+
by 0x........: main
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
prog: fdleak_doubleclose0
2+
vgopts: -q --track-fds=yes
3+
stderr_filter: filter_fdleak

0 commit comments

Comments
 (0)