From: Paul Floyd Date: Tue, 30 Jan 2024 21:02:21 +0000 (+0100) Subject: Bug 480405 - valgrind 3.22.0 "m_debuginfo/image.c:586 (set_CEnt): Assertion '!sr_isEr... X-Git-Tag: VALGRIND_3_23_0~192 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2c8ecd648204a8be01714fa6878373f57e073d25;p=thirdparty%2Fvalgrind.git Bug 480405 - valgrind 3.22.0 "m_debuginfo/image.c:586 (set_CEnt): Assertion '!sr_isError(sr)' failed." --- diff --git a/.gitignore b/.gitignore index 7ad5cf912b..c874f10070 100644 --- a/.gitignore +++ b/.gitignore @@ -1547,6 +1547,7 @@ /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 d03bd777e3..e3b115178d 100644 --- 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 diff --git a/coregrind/m_debuginfo/image.c b/coregrind/m_debuginfo/image.c index 445f955551..4ef01c5251 100644 --- a/coregrind/m_debuginfo/image.c +++ b/coregrind/m_debuginfo/image.c @@ -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 diff --git a/include/vki/vki-amd64-linux.h b/include/vki/vki-amd64-linux.h index fbd353aed0..e5b7ec6cd1 100644 --- a/include/vki/vki-amd64-linux.h +++ b/include/vki/vki-amd64-linux.h @@ -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 diff --git a/include/vki/vki-arm-linux.h b/include/vki/vki-arm-linux.h index 88db6a0b00..7e0001c0cf 100644 --- a/include/vki/vki-arm-linux.h +++ b/include/vki/vki-arm-linux.h @@ -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 diff --git a/include/vki/vki-arm64-linux.h b/include/vki/vki-arm64-linux.h index 69fb3ed00c..2fc97e614f 100644 --- a/include/vki/vki-arm64-linux.h +++ b/include/vki/vki-arm64-linux.h @@ -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 diff --git a/include/vki/vki-mips32-linux.h b/include/vki/vki-mips32-linux.h index 25ae7d6570..2d752e2ccb 100644 --- a/include/vki/vki-mips32-linux.h +++ b/include/vki/vki-mips32-linux.h @@ -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 diff --git a/include/vki/vki-mips64-linux.h b/include/vki/vki-mips64-linux.h index dc15c6e69e..527b0dae63 100644 --- a/include/vki/vki-mips64-linux.h +++ b/include/vki/vki-mips64-linux.h @@ -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 diff --git a/include/vki/vki-ppc32-linux.h b/include/vki/vki-ppc32-linux.h index 8f59b1fd17..9d02e70d4f 100644 --- a/include/vki/vki-ppc32-linux.h +++ b/include/vki/vki-ppc32-linux.h @@ -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 diff --git a/include/vki/vki-ppc64-linux.h b/include/vki/vki-ppc64-linux.h index 04f72048aa..2fcc2c54c8 100644 --- a/include/vki/vki-ppc64-linux.h +++ b/include/vki/vki-ppc64-linux.h @@ -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 diff --git a/include/vki/vki-s390x-linux.h b/include/vki/vki-s390x-linux.h index 71b363029c..9d1cf1dde7 100644 --- a/include/vki/vki-s390x-linux.h +++ b/include/vki/vki-s390x-linux.h @@ -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 diff --git a/include/vki/vki-x86-linux.h b/include/vki/vki-x86-linux.h index 35528bb6f6..5a5f9e5d82 100644 --- a/include/vki/vki-x86-linux.h +++ b/include/vki/vki-x86-linux.h @@ -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 diff --git a/none/tests/Makefile.am b/none/tests/Makefile.am index 253d4a140c..2d71d668bb 100644 --- a/none/tests/Makefile.am +++ b/none/tests/Makefile.am @@ -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 index 0000000000..b713391726 --- /dev/null +++ b/none/tests/mmap_o_direct.c @@ -0,0 +1,16 @@ +#include +#define __USE_GNU +#include +#include +#include + +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 index 0000000000..e69de29bb2 diff --git a/none/tests/mmap_o_direct.vgtest b/none/tests/mmap_o_direct.vgtest new file mode 100644 index 0000000000..2c9315984a --- /dev/null +++ b/none/tests/mmap_o_direct.vgtest @@ -0,0 +1,2 @@ +prog: mmap_o_direct +vgopts: -q