]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Check whether file descriptor is inherited before printing where_opened users/mark/try-doubleclose0
authorMark Wielaard <mark@klomp.org>
Sun, 18 May 2025 13:31:36 +0000 (15:31 +0200)
committerMark Wielaard <mark@klomp.org>
Sun, 18 May 2025 13:31:36 +0000 (15:31 +0200)
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

coregrind/m_syswrap/syswrap-generic.c
none/tests/Makefile.am
none/tests/fdleak_doubleclose0.c [new file with mode: 0644]
none/tests/fdleak_doubleclose0.stderr.exp [new file with mode: 0644]
none/tests/fdleak_doubleclose0.vgtest [new file with mode: 0644]

index 81c8fc028d8834ee6a5b1a741f767357c589ee0c..98cbb172fdd249c85e60b616532a23a2da5dacb8 100644 (file)
@@ -637,7 +637,8 @@ struct BadCloseExtra {
    HChar *description;            /* Description of the file descriptor
                                      might include the pathname */
    ExeContext *where_closed;      /* record the last close of fd */
-   ExeContext *where_opened;      /* recordwhere the fd  was opened */
+   ExeContext *where_opened;      /* recordwhere the fd  was opened,
+                                     NULL if inherited file descriptor */
 };
 
 struct FdBadUse {
@@ -646,7 +647,8 @@ struct FdBadUse {
   HChar *description;            /* Description of the file descriptor
                                     might include the pathname */
   ExeContext *where_closed;      /* record the last close of fd */
-  ExeContext *where_opened;      /* recordwhere the fd  was opened */
+  ExeContext *where_opened;      /* recordwhere the fd  was opened,
+                                    NULL if inherited file descriptor */
 };
 
 struct NotClosedExtra {
@@ -1197,8 +1199,11 @@ void fd_pp_Error (const Error *err)
       VG_(pp_ExeContext)( where );
       VG_(emit)("%sPreviously closed%s\n", auxpre, auxpost);
       VG_(pp_ExeContext)(bce->where_closed);
-      VG_(emit)("%sOriginally opened%s\n", auxpre, auxpost);
-      VG_(pp_ExeContext)(bce->where_opened);
+      // Inherited file descriptors where never opened (by the program)
+      if (bce->where_opened) {
+         VG_(emit)("%sOriginally opened%s\n", auxpre, auxpost);
+         VG_(pp_ExeContext)(bce->where_opened);
+      }
    } else if (VG_(get_error_kind)(err) == FdNotClosed) {
       if (xml) VG_(emit)("  <kind>FdNotClosed</kind>\n");
       struct NotClosedExtra *nce = (struct NotClosedExtra *)
index bebc2f4dd1954c8e63b7afb3e90362e1f93e736b..6305044ca60e987d76cbec71fbef009857a99d98 100644 (file)
@@ -150,6 +150,7 @@ EXTRA_DIST = \
        fdleak_creat_xml.stderr.exp fdleak_creat_xml.vgtest \
        fdleak_creat_sup.stderr.exp fdleak_creat_sup.supp \
        fdleak_creat_sup.vgtest \
+       fdleak_doubleclose0.stderr.exp fdleak_doubleclose0.vgtest \
        fdleak_dup.stderr.exp fdleak_dup.vgtest \
        fdleak_dup_xml.stderr.exp fdleak_dup_xml.vgtest \
        fdleak_dup2.stderr.exp fdleak_dup2.vgtest \
@@ -283,7 +284,7 @@ check_PROGRAMS = \
        bug492678 \
        closeall coolo_strlen \
        discard exec-sigmask execve faultstatus fcntl_setown \
-       fdleak_cmsg fdleak_creat fdleak_dup fdleak_dup2 \
+       fdleak_cmsg fdleak_creat fdleak_doubleclose0 fdleak_dup fdleak_dup2 \
        fdleak_fcntl fdleak_ipv4 fdleak_open fdleak_pipe \
        fdleak_socketpair \
        floored fork fucomip \
diff --git a/none/tests/fdleak_doubleclose0.c b/none/tests/fdleak_doubleclose0.c
new file mode 100644 (file)
index 0000000..83c89a8
--- /dev/null
@@ -0,0 +1,10 @@
+#include <unistd.h>
+
+int main (int argc, char **argv)
+{
+   close (0);
+   close (1);
+   close (1);
+   close (0);
+   return 0;
+}
diff --git a/none/tests/fdleak_doubleclose0.stderr.exp b/none/tests/fdleak_doubleclose0.stderr.exp
new file mode 100644 (file)
index 0000000..6487cf8
--- /dev/null
@@ -0,0 +1,12 @@
+File descriptor ...: ... is already closed
+   at 0x........: close (in /...libc...)
+   by 0x........: main
+ Previously closed
+   at 0x........: close (in /...libc...)
+   by 0x........: main
+File descriptor ...: ... is already closed
+   at 0x........: close (in /...libc...)
+   by 0x........: main
+ Previously closed
+   at 0x........: close (in /...libc...)
+   by 0x........: main
diff --git a/none/tests/fdleak_doubleclose0.vgtest b/none/tests/fdleak_doubleclose0.vgtest
new file mode 100644 (file)
index 0000000..36d3e36
--- /dev/null
@@ -0,0 +1,3 @@
+prog: fdleak_doubleclose0
+vgopts: -q --track-fds=yes
+stderr_filter: filter_fdleak