]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Bug 480405 - valgrind 3.22.0 "m_debuginfo/image.c:586 (set_CEnt): Assertion '!sr_isEr...
authorPaul Floyd <pjfloyd@wanadoo.fr>
Tue, 30 Jan 2024 21:02:21 +0000 (22:02 +0100)
committerPaul Floyd <pjfloyd@wanadoo.fr>
Tue, 30 Jan 2024 21:02:21 +0000 (22:02 +0100)
16 files changed:
.gitignore
NEWS
coregrind/m_debuginfo/image.c
include/vki/vki-amd64-linux.h
include/vki/vki-arm-linux.h
include/vki/vki-arm64-linux.h
include/vki/vki-mips32-linux.h
include/vki/vki-mips64-linux.h
include/vki/vki-ppc32-linux.h
include/vki/vki-ppc64-linux.h
include/vki/vki-s390x-linux.h
include/vki/vki-x86-linux.h
none/tests/Makefile.am
none/tests/mmap_o_direct.c [new file with mode: 0644]
none/tests/mmap_o_direct.stderr.exp [new file with mode: 0644]
none/tests/mmap_o_direct.vgtest [new file with mode: 0644]

index 7ad5cf912b031ace692baedf5e73bd64dfc713a4..c874f10070faf3582cbe38519295ba7ff04ebe71 100644 (file)
 /none/tests/map_unmap
 /none/tests/mmap_fcntl_bug
 /none/tests/mq
+/none/tests/mmap_o_direct
 /none/tests/mremap
 /none/tests/mremap2
 /none/tests/munmap_exe
diff --git a/NEWS b/NEWS
index d03bd777e376bcd4f054dd5adaec9acd884ed861..e3b115178df57a288e23d7eb940c77010732b23a 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -53,6 +53,8 @@ are not entered into bugzilla tend to get forgotten about or ignored.
 479041  Executables without RW sections do not trigger debuginfo reading
 480052  WARNING: unhandled amd64-freebsd syscall: 580
 480126  Build failure on Raspberry Pi 5 / OS 6.1.0-rpi7-rpi-v8
+480405  valgrind 3.22.0 "m_debuginfo/image.c:586 (set_CEnt):
+        Assertion '!sr_isError(sr)' failed."
 480488  Add support for FreeBSD 13.3
 n-i-bz  Add redirect for memccpy
 
index 445f95555151fa605f88307495c9610c846e3612..4ef01c5251582f585138caf699cf05e6ab94c0e2 100644 (file)
@@ -582,7 +582,28 @@ static void set_CEnt ( const DiImage* img, UInt entNo, DiOffT off )
 
    if (img->source.is_local) {
       // Simple: just read it
+
+      // PJF not quite so simple - see
+      // https://bugs.kde.org/show_bug.cgi?id=480405
+      // if img->source.fd was opened with O_DIRECT the memory needs
+      // to be aligned and also the length
+      // that's a lot of hassle just to take a quick peek to see if
+      // is an ELF binary so just twiddle the flag before and after
+      // peeking.
+      // This doesn't seem to be a problem on FreeBSD. I haven't tested
+      // on macOS or Solaris, hence the conditional compilation
+#if defined(VKI_O_DIRECT)
+      Int flags = VG_(fcntl)(img->source.fd, VKI_F_GETFL, 0);
+      if (flags & VKI_O_DIRECT) {
+          VG_(fcntl)(img->source.fd, VKI_F_SETFL, flags & ~VKI_O_DIRECT);
+      }
+#endif
       SysRes sr = VG_(pread)(img->source.fd, &ce->data[0], (Int)len, off);
+#if defined(VKI_O_DIRECT)
+      if (flags & VKI_O_DIRECT) {
+         VG_(fcntl)(img->source.fd, VKI_F_SETFL, flags);
+      }
+#endif
       vg_assert(!sr_isError(sr));
    } else {
       // Not so simple: poke the server
index fbd353aed09acdba7f9897efdda20fe3fcef56c1..e5b7ec6cd1d3cd08b50677e134ac0def73a69a75 100644 (file)
@@ -250,6 +250,7 @@ struct vki_sigcontext {
 #define VKI_O_TRUNC      01000 /* not fcntl */
 #define VKI_O_APPEND     02000
 #define VKI_O_NONBLOCK   04000
+#define VKI_O_DIRECT     040000
 #define VKI_O_LARGEFILE        0100000
 
 #define VKI_AT_FDCWD            -100
index 88db6a0b004d0049b7be1297fb3708bcf7873aa9..7e0001c0cf47fc2b07b047ff7be75059f86fe81c 100644 (file)
@@ -248,6 +248,7 @@ struct vki_sigcontext {
 #define VKI_O_APPEND     02000
 #define VKI_O_NONBLOCK   04000
 #define VKI_O_LARGEFILE        0100000
+#define VKI_O_DIRECT   0200000
 
 #define VKI_AT_FDCWD            -100
 
index 69fb3ed00cb7aaba39c350d82b7ee20b3b58953f..2fc97e614f6ff93a06eaca7543a0241244f182d7 100644 (file)
@@ -230,6 +230,7 @@ struct vki_sigcontext {
 #define VKI_O_APPEND     02000
 #define VKI_O_NONBLOCK   04000
 #define VKI_O_LARGEFILE        0100000
+#define VKI_O_DIRECT   0200000
 
 #define VKI_AT_FDCWD            -100
 
index 25ae7d6570a318355741c3f3834dd6ae1560119f..2d752e2ccbb75c108168ac9dd81b2f7e7c7eb825 100644 (file)
@@ -319,6 +319,7 @@ struct vki_sigcontext {
 #define VKI_O_APPEND           0x0008
 #define VKI_O_NONBLOCK         0x0080
 #define VKI_O_LARGEFILE        0x2000
+#define VKI_O_DIRECT            0x8000
 
 #define VKI_AT_FDCWD            -100
 
index dc15c6e69e96438e2644a0776266d18a3102bf57..527b0dae63067bf5e0ccb2ef6502cf8000a4d6cd 100644 (file)
@@ -324,6 +324,7 @@ struct vki_sigcontext {
 #define VKI_O_APPEND        0x0008
 #define VKI_O_NONBLOCK      0x0080
 #define VKI_O_LARGEFILE     0x2000
+#define VKI_O_DIRECT        0x8000
 
 #define VKI_AT_FDCWD        -100
 
index 8f59b1fd1733c8083da4871134415b2e79c2a543..9d02e70d4fa1abe38cf6eeeee21892cd38554862 100644 (file)
@@ -314,6 +314,7 @@ struct vki_sigcontext {
 #define VKI_O_TRUNC            01000           /* not fcntl */
 #define VKI_O_APPEND           02000
 #define VKI_O_NONBLOCK         04000
+#define VKI_O_DIRECT           040000
 #define VKI_O_LARGEFILE     0200000
 
 #define VKI_AT_FDCWD            -100
index 04f72048aa489d39fd245b3248beaaa33b050d30..2fcc2c54c84afda314da08225ef44eb2dd98ac7a 100644 (file)
@@ -377,6 +377,7 @@ struct vki_sigcontext {
 #define VKI_O_TRUNC           01000 /* not fcntl */
 #define VKI_O_APPEND          02000
 #define VKI_O_NONBLOCK        04000
+#define VKI_O_DIRECT         040000
 #define VKI_O_LARGEFILE     0200000
 
 #define VKI_AT_FDCWD            -100
index 71b363029cf40ef336baec858ffeeb60e6532a82..9d1cf1dde73a1bc4d905242c9bb7b05a16b4dd11 100644 (file)
@@ -320,6 +320,7 @@ typedef struct vki_sigaltstack {
 #define VKI_O_TRUNC         00001000        /* not fcntl */
 #define VKI_O_APPEND        00002000
 #define VKI_O_NONBLOCK      00004000
+#define VKI_O_DIRECT        00040000
 
 #define VKI_AT_FDCWD            -100
 
index 35528bb6f6292dcffd409492a16ef3ad2d73af97..5a5f9e5d82ec262aa7238140565c84ef7220543b 100644 (file)
@@ -285,6 +285,7 @@ struct vki_sigcontext {
 #define VKI_O_TRUNC      01000 /* not fcntl */
 #define VKI_O_APPEND     02000
 #define VKI_O_NONBLOCK   04000
+#define VKI_O_DIRECT     040000
 #define VKI_O_LARGEFILE        0100000
 
 #define VKI_AT_FDCWD            -100
index 253d4a140c1af9c82efe9120eadd14e52bdb2c93..2d71d668bbfccb0117c76df3d6b2e2847fdf104a 100644 (file)
@@ -151,6 +151,7 @@ EXTRA_DIST = \
        map_unmap.stderr.exp map_unmap.stdout.exp map_unmap.vgtest \
        mmap_fcntl_bug.vgtest mmap_fcntl_bug.stdout.exp \
                mmap_fcntl_bug.stderr.exp \
+       mmap_o_direct.stderr.exp mmap_o_direct.vgtest \
        mq.stderr.exp mq.vgtest \
        munmap_exe.stderr.exp munmap_exe.vgtest \
        nestedfns.stderr.exp nestedfns.stdout.exp nestedfns.vgtest \
@@ -244,6 +245,7 @@ check_PROGRAMS = \
        libvexmultiarch_test \
        manythreads \
        mmap_fcntl_bug \
+       mmap_o_direct \
        munmap_exe map_unaligned map_unmap mq \
        nocwd \
        pending \
diff --git a/none/tests/mmap_o_direct.c b/none/tests/mmap_o_direct.c
new file mode 100644 (file)
index 0000000..b713391
--- /dev/null
@@ -0,0 +1,16 @@
+#include <unistd.h>
+#define __USE_GNU
+#include <fcntl.h>
+#include <sys/mman.h>
+#include <stddef.h>
+
+int main(void)
+{
+   int fd = open("mmap_o_direct.c", O_RDONLY | O_DIRECT);
+   if (-1 != fd)
+   {
+      void* m = mmap(NULL, 307, PROT_READ, MAP_PRIVATE, fd, 0);
+      munmap(m, 307);
+      close(fd);
+   }
+}
diff --git a/none/tests/mmap_o_direct.stderr.exp b/none/tests/mmap_o_direct.stderr.exp
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/none/tests/mmap_o_direct.vgtest b/none/tests/mmap_o_direct.vgtest
new file mode 100644 (file)
index 0000000..2c93159
--- /dev/null
@@ -0,0 +1,2 @@
+prog: mmap_o_direct
+vgopts: -q