]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Deal with linux arches that don't have getdents, only getdents64 users/mark/try-getdents
authorMark Wielaard <mark@klomp.org>
Wed, 24 Sep 2025 21:16:29 +0000 (23:16 +0200)
committerMark Wielaard <mark@klomp.org>
Wed, 24 Sep 2025 21:16:29 +0000 (23:16 +0200)
coregrind/m_syswrap/syswrap-generic.c
none/tests/Makefile.am
none/tests/linux/Makefile.am
none/tests/linux/getdents_filter.c [moved from none/tests/getdents_filter.c with 96% similarity]
none/tests/linux/getdents_filter.stderr.exp [moved from none/tests/getdents_filter.stderr.exp with 100% similarity]
none/tests/linux/getdents_filter.stdout.exp [moved from none/tests/getdents_filter.stdout.exp with 100% similarity]
none/tests/linux/getdents_filter.vgtest [moved from none/tests/getdents_filter.vgtest with 100% similarity]

index 33b58f5a5e93940f0233aeecc0c0a2aa21bce5a0..325ce1e3ffd83be4e4ae4840481578f43557d4e6 100644 (file)
@@ -4091,6 +4091,10 @@ static SizeT filter_dirent64_entries(struct vki_dirent64 *dirp, SizeT orig_size)
    return new_size;
 }
 
+/* Make sure we really need the proc filtering using (32bit) getdents,
+   which not every linux arch implements.  */
+#if defined(VGO_linux) && defined(__NR_getdents)
+
 /* Filter out Valgrind's internal file descriptors from getdents results with refill capability.
    When entries are filtered out, attempts to read more entries to avoid empty results.
    Returns filtered size on success, or -1 if retry syscall failed. */
@@ -4119,6 +4123,7 @@ static SizeT filter_valgrind_fds_from_getdents_with_refill(Int fd, struct vki_di
 
    return new_size;
 }
+#endif /* defined(VGO_linux) && defined(__NR_getdents) */
 
 /* Filter out Valgrind's internal file descriptors from getdents64 results with refill capability.
    Same logic as getdents version but for 64-bit dirent structures.
@@ -4155,6 +4160,10 @@ POST(sys_getdents)
    if (RES > 0) {
       SizeT result_size = RES;
       
+      /* Make sure we really need the proc filtering using (32bit) getdents,
+         which not every linux arch implements.  */
+#if defined(VGO_linux) && defined(__NR_getdents)
+
       /* Only filter Valgrind FDs when listing /proc/PID/fd or /proc/PID/fdinfo directories */
       if (is_proc_fd_directory(ARG1)) {
          SizeT filtered_size = filter_valgrind_fds_from_getdents_with_refill(ARG1, (struct vki_dirent *)ARG2, RES, ARG3, status);
@@ -4166,6 +4175,7 @@ POST(sys_getdents)
          if (result_size != RES)
             SET_STATUS_Success(result_size);
       }
+#endif /* defined(VGO_linux) && defined(__NR_getdents) */
       
       POST_MEM_WRITE( ARG2, result_size );
    }
index ccdd85e53e12cb9f11055ae8f4ad787b4723802f..716ce000d39a95375c90e73ad662353e8511d3f6 100644 (file)
@@ -172,7 +172,6 @@ EXTRA_DIST = \
        floored.stderr.exp floored.stdout.exp floored.vgtest \
        fork.stderr.exp fork.stdout.exp fork.vgtest \
        fucomip.stderr.exp fucomip.vgtest \
-       getdents_filter.stderr.exp getdents_filter.stdout.exp getdents_filter.vgtest \
        gxx304.stderr.exp gxx304.vgtest \
        ifunc.stderr.exp ifunc.stdout.exp ifunc.vgtest \
        ioctl_moans.stderr.exp ioctl_moans.vgtest \
@@ -292,7 +291,6 @@ check_PROGRAMS = \
        fdleak_fcntl fdleak_ipv4 fdleak_open fdleak_pipe \
        fdleak_socketpair \
        floored fork fucomip \
-       getdents_filter \
        ioctl_moans \
        libvex_test \
        libvexmultiarch_test \
index 7bfcedc8620a41bdd940aa9d7410c2e92e04ce6b..55426e2b2664f3b480501d28b47f7e6de488c12c 100644 (file)
@@ -10,6 +10,7 @@ EXTRA_DIST = \
        bug498317.stderr.exp bug498317.supp bug498317.vgtest \
        bug506910.stderr.exp bug506910.vgtest \
        clonev.stdout.exp clonev.stderr.exp clonev.vgtest \
+       getdents_filter.stderr.exp getdents_filter.stdout.exp getdents_filter.vgtest \
         membarrier.stderr.exp membarrier.vgtest \
        mremap.stderr.exp mremap.stderr.exp-glibc27 mremap.stdout.exp \
            mremap.vgtest \
@@ -28,6 +29,7 @@ check_PROGRAMS = \
        brk-overflow2 \
        bug498317 \
        clonev \
+       getdents_filter \
        mremap \
        mremap2 \
        mremap3 \
similarity index 96%
rename from none/tests/getdents_filter.c
rename to none/tests/linux/getdents_filter.c
index d508cdde0f952b6efcb0141c5dc37b8272bf0e34..887418fad2db2a15e0980e75012c38196c069a2a 100644 (file)
@@ -83,7 +83,9 @@ static void test_retry_logic_with_small_buffer(void)
      * may return only Valgrind FDs, which will trigger the retry mechanism.
      */
     for (;;) {
-        nread = syscall(SYS_getdents, fd, buf, SMALL_BUF_SIZE);
+        /* Note, using getdents64 since some linux arches don't implement
+           the 32bit getdents. */
+        nread = syscall(SYS_getdents64, fd, buf, SMALL_BUF_SIZE);
 
         if (nread == -1) {
             printf("retry_test_error\n");