Blame SOURCES/valgrind-3.16.1-epoll.patch

4f2909
commit f326d68d762edf4b0e9604daa446b6f8ca25725a
4f2909
Author: Mark Wielaard <mark@klomp.org>
4f2909
Date:   Sun Jul 26 22:40:22 2020 +0200
4f2909
4f2909
    epoll_ctl warns for uninitialized padding on non-amd64 64bit arches
4f2909
    
4f2909
    struct vki_epoll_event is packed on x86_64, but not on other 64bit
4f2909
    arches. This means that on 64bit arches there can be padding in the
4f2909
    epoll_event struct. Seperately the data field is only used by user
4f2909
    space (which might not set the data field if it doesn't need to).
4f2909
    
4f2909
    Only check the events field on epoll_ctl. But assume both events
4f2909
    and data are both written to by epoll_[p]wait (exclude padding).
4f2909
    
4f2909
    https://bugs.kde.org/show_bug.cgi?id=422623
4f2909
4f2909
diff --git a/coregrind/m_syswrap/syswrap-linux.c b/coregrind/m_syswrap/syswrap-linux.c
4f2909
index 5b5b7eee6..929a4d9af 100644
4f2909
--- a/coregrind/m_syswrap/syswrap-linux.c
4f2909
+++ b/coregrind/m_syswrap/syswrap-linux.c
4f2909
@@ -2099,8 +2099,29 @@ PRE(sys_epoll_ctl)
4f2909
          SARG1, ( ARG2<3 ? epoll_ctl_s[ARG2] : "?" ), SARG3, ARG4);
4f2909
    PRE_REG_READ4(long, "epoll_ctl",
4f2909
                  int, epfd, int, op, int, fd, struct vki_epoll_event *, event);
4f2909
-   if (ARG2 != VKI_EPOLL_CTL_DEL)
4f2909
-      PRE_MEM_READ( "epoll_ctl(event)", ARG4, sizeof(struct vki_epoll_event) );
4f2909
+   if (ARG2 != VKI_EPOLL_CTL_DEL) {
4f2909
+      /* Just check the events field, the data field is for user space and
4f2909
+         unused by the kernel.  */
4f2909
+      struct vki_epoll_event *event = (struct vki_epoll_event *) ARG4;
4f2909
+      PRE_MEM_READ( "epoll_ctl(event)", (Addr) &event->events,
4f2909
+                    sizeof(__vki_u32) );
4f2909
+   }
4f2909
+}
4f2909
+
4f2909
+/* RES event records have been written (exclude padding).  */
4f2909
+static void epoll_post_helper ( ThreadId tid, SyscallArgs* arrghs,
4f2909
+                                SyscallStatus* status )
4f2909
+{
4f2909
+   vg_assert(SUCCESS);
4f2909
+   if (RES > 0) {
4f2909
+      Int i;
4f2909
+      struct vki_epoll_event **events = (struct vki_epoll_event**)(Addr)ARG2;
4f2909
+      for (i = 0; i < RES; i++) {
4f2909
+         /* Assume both events and data are set (data is user space only). */
4f2909
+         POST_FIELD_WRITE(events[i]->events);
4f2909
+         POST_FIELD_WRITE(events[i]->data);
4f2909
+      }
4f2909
+   }
4f2909
 }
4f2909
 
4f2909
 PRE(sys_epoll_wait)
4f2909
@@ -2111,13 +2132,12 @@ PRE(sys_epoll_wait)
4f2909
    PRE_REG_READ4(long, "epoll_wait",
4f2909
                  int, epfd, struct vki_epoll_event *, events,
4f2909
                  int, maxevents, int, timeout);
4f2909
+   /* Assume all (maxevents) events records should be (fully) writable. */
4f2909
    PRE_MEM_WRITE( "epoll_wait(events)", ARG2, sizeof(struct vki_epoll_event)*ARG3);
4f2909
 }
4f2909
 POST(sys_epoll_wait)
4f2909
 {
4f2909
-   vg_assert(SUCCESS);
4f2909
-   if (RES > 0)
4f2909
-      POST_MEM_WRITE( ARG2, sizeof(struct vki_epoll_event)*RES ) ;
4f2909
+   epoll_post_helper (tid, arrghs, status);
4f2909
 }
4f2909
 
4f2909
 PRE(sys_epoll_pwait)
4f2909
@@ -2130,15 +2150,14 @@ PRE(sys_epoll_pwait)
4f2909
                  int, epfd, struct vki_epoll_event *, events,
4f2909
                  int, maxevents, int, timeout, vki_sigset_t *, sigmask,
4f2909
                  vki_size_t, sigsetsize);
4f2909
+   /* Assume all (maxevents) events records should be (fully) writable. */
4f2909
    PRE_MEM_WRITE( "epoll_pwait(events)", ARG2, sizeof(struct vki_epoll_event)*ARG3);
4f2909
    if (ARG5)
4f2909
       PRE_MEM_READ( "epoll_pwait(sigmask)", ARG5, sizeof(vki_sigset_t) );
4f2909
 }
4f2909
 POST(sys_epoll_pwait)
4f2909
 {
4f2909
-   vg_assert(SUCCESS);
4f2909
-   if (RES > 0)
4f2909
-      POST_MEM_WRITE( ARG2, sizeof(struct vki_epoll_event)*RES ) ;
4f2909
+   epoll_post_helper (tid, arrghs, status);
4f2909
 }
4f2909
 
4f2909
 PRE(sys_eventfd)
4f2909
commit b74f9f23c8758c77367f18368ea95baa858544cb
4f2909
Author: Mark Wielaard <mark@klomp.org>
4f2909
Date:   Tue Aug 18 23:58:55 2020 +0200
4f2909
4f2909
    Fix epoll_ctl setting of array event and data fields.
4f2909
    
4f2909
    Fix for https://bugs.kde.org/show_bug.cgi?id=422623 in commit ecf5ba119
4f2909
    epoll_ctl warns for uninitialized padding on non-amd64 64bit arches
4f2909
    contained a bug. A pointer to an array is not a pointer to a pointer to
4f2909
    an array. Found by a Fedora user:
4f2909
    https://bugzilla.redhat.com/show_bug.cgi?id=1844778#c10
4f2909
4f2909
diff --git a/coregrind/m_syswrap/syswrap-linux.c b/coregrind/m_syswrap/syswrap-linux.c
4f2909
index 0850487e9..3f488795a 100644
4f2909
--- a/coregrind/m_syswrap/syswrap-linux.c
4f2909
+++ b/coregrind/m_syswrap/syswrap-linux.c
4f2909
@@ -2115,11 +2115,11 @@ static void epoll_post_helper ( ThreadId tid, SyscallArgs* arrghs,
4f2909
    vg_assert(SUCCESS);
4f2909
    if (RES > 0) {
4f2909
       Int i;
4f2909
-      struct vki_epoll_event **events = (struct vki_epoll_event**)(Addr)ARG2;
4f2909
+      struct vki_epoll_event *events = (struct vki_epoll_event*)(Addr)ARG2;
4f2909
       for (i = 0; i < RES; i++) {
4f2909
          /* Assume both events and data are set (data is user space only). */
4f2909
-         POST_FIELD_WRITE(events[i]->events);
4f2909
-         POST_FIELD_WRITE(events[i]->data);
4f2909
+         POST_FIELD_WRITE(events[i].events);
4f2909
+         POST_FIELD_WRITE(events[i].data);
4f2909
       }
4f2909
    }
4f2909
 }