diff --git a/valgrind-3.16.1-epoll.patch b/valgrind-3.16.1-epoll.patch new file mode 100644 index 0000000..5bb1808 --- /dev/null +++ b/valgrind-3.16.1-epoll.patch @@ -0,0 +1,86 @@ +commit f326d68d762edf4b0e9604daa446b6f8ca25725a +Author: Mark Wielaard +Date: Sun Jul 26 22:40:22 2020 +0200 + + epoll_ctl warns for uninitialized padding on non-amd64 64bit arches + + struct vki_epoll_event is packed on x86_64, but not on other 64bit + arches. This means that on 64bit arches there can be padding in the + epoll_event struct. Seperately the data field is only used by user + space (which might not set the data field if it doesn't need to). + + Only check the events field on epoll_ctl. But assume both events + and data are both written to by epoll_[p]wait (exclude padding). + + https://bugs.kde.org/show_bug.cgi?id=422623 + +diff --git a/coregrind/m_syswrap/syswrap-linux.c b/coregrind/m_syswrap/syswrap-linux.c +index 5b5b7eee6..929a4d9af 100644 +--- a/coregrind/m_syswrap/syswrap-linux.c ++++ b/coregrind/m_syswrap/syswrap-linux.c +@@ -2099,8 +2099,29 @@ PRE(sys_epoll_ctl) + SARG1, ( ARG2<3 ? epoll_ctl_s[ARG2] : "?" ), SARG3, ARG4); + PRE_REG_READ4(long, "epoll_ctl", + int, epfd, int, op, int, fd, struct vki_epoll_event *, event); +- if (ARG2 != VKI_EPOLL_CTL_DEL) +- PRE_MEM_READ( "epoll_ctl(event)", ARG4, sizeof(struct vki_epoll_event) ); ++ if (ARG2 != VKI_EPOLL_CTL_DEL) { ++ /* Just check the events field, the data field is for user space and ++ unused by the kernel. */ ++ struct vki_epoll_event *event = (struct vki_epoll_event *) ARG4; ++ PRE_MEM_READ( "epoll_ctl(event)", (Addr) &event->events, ++ sizeof(__vki_u32) ); ++ } ++} ++ ++/* RES event records have been written (exclude padding). */ ++static void epoll_post_helper ( ThreadId tid, SyscallArgs* arrghs, ++ SyscallStatus* status ) ++{ ++ vg_assert(SUCCESS); ++ if (RES > 0) { ++ Int i; ++ struct vki_epoll_event **events = (struct vki_epoll_event**)(Addr)ARG2; ++ for (i = 0; i < RES; i++) { ++ /* Assume both events and data are set (data is user space only). */ ++ POST_FIELD_WRITE(events[i]->events); ++ POST_FIELD_WRITE(events[i]->data); ++ } ++ } + } + + PRE(sys_epoll_wait) +@@ -2111,13 +2132,12 @@ PRE(sys_epoll_wait) + PRE_REG_READ4(long, "epoll_wait", + int, epfd, struct vki_epoll_event *, events, + int, maxevents, int, timeout); ++ /* Assume all (maxevents) events records should be (fully) writable. */ + PRE_MEM_WRITE( "epoll_wait(events)", ARG2, sizeof(struct vki_epoll_event)*ARG3); + } + POST(sys_epoll_wait) + { +- vg_assert(SUCCESS); +- if (RES > 0) +- POST_MEM_WRITE( ARG2, sizeof(struct vki_epoll_event)*RES ) ; ++ epoll_post_helper (tid, arrghs, status); + } + + PRE(sys_epoll_pwait) +@@ -2130,15 +2150,14 @@ PRE(sys_epoll_pwait) + int, epfd, struct vki_epoll_event *, events, + int, maxevents, int, timeout, vki_sigset_t *, sigmask, + vki_size_t, sigsetsize); ++ /* Assume all (maxevents) events records should be (fully) writable. */ + PRE_MEM_WRITE( "epoll_pwait(events)", ARG2, sizeof(struct vki_epoll_event)*ARG3); + if (ARG5) + PRE_MEM_READ( "epoll_pwait(sigmask)", ARG5, sizeof(vki_sigset_t) ); + } + POST(sys_epoll_pwait) + { +- vg_assert(SUCCESS); +- if (RES > 0) +- POST_MEM_WRITE( ARG2, sizeof(struct vki_epoll_event)*RES ) ; ++ epoll_post_helper (tid, arrghs, status); + } + + PRE(sys_eventfd) diff --git a/valgrind.spec b/valgrind.spec index 141f77f..0245617 100644 --- a/valgrind.spec +++ b/valgrind.spec @@ -96,6 +96,9 @@ Patch6: valgrind-3.16.0-some-Wl-z-now.patch # KDE#422174 unhandled instruction bytes: 0x48 0xE9 (REX prefix JMP instr) Patch7: valgrind-3.16.1-REX-prefix-JMP.patch +# KDE#422623 epoll_ctl warns for uninit padding on non-amd64 64bit arches +Patch8: valgrind-3.16.1-epoll.patch + BuildRequires: glibc-devel %if %{build_openmpi} @@ -228,6 +231,7 @@ Valgrind User Manual for details. %endif %patch7 -p1 +%patch8 -p1 %build # LTO triggers undefined symbols in valgrind. Valgrind has a --enable-lto @@ -454,6 +458,7 @@ fi %changelog * Mon Jul 27 2020 Mark Wielaard - Add valgrind-3.16.1-REX-prefix-JMP.patch +- Add valgrind-3.16.1-epoll.patch * Tue Jul 14 2020 Tom Stellard - 3.16.1-3 - Use make macros