diff options
author | gVisor bot <gvisor-bot@google.com> | 2019-07-30 20:40:21 +0000 |
---|---|---|
committer | gVisor bot <gvisor-bot@google.com> | 2019-07-30 20:40:21 +0000 |
commit | 0024fd95caa08c2edf09f516e309196a6edca307 (patch) | |
tree | 758d10b2937d43dca61c1484315afd492c6cbff7 /pkg/sentry/syscalls/linux/sys_epoll.go | |
parent | 24c382940aa216e50c3c9ebeb97235fc114cdb94 (diff) | |
parent | 93b0917d236d96ef4dfb2a1996da10d2be7a872c (diff) |
Merge 93b0917d (automated)
Diffstat (limited to 'pkg/sentry/syscalls/linux/sys_epoll.go')
-rw-r--r-- | pkg/sentry/syscalls/linux/sys_epoll.go | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/pkg/sentry/syscalls/linux/sys_epoll.go b/pkg/sentry/syscalls/linux/sys_epoll.go index 4a2b9f061..65b4a227b 100644 --- a/pkg/sentry/syscalls/linux/sys_epoll.go +++ b/pkg/sentry/syscalls/linux/sys_epoll.go @@ -107,19 +107,20 @@ func EpollCtl(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.Sysc // copyOutEvents copies epoll events from the kernel to user memory. func copyOutEvents(t *kernel.Task, addr usermem.Addr, e []epoll.Event) error { const itemLen = 12 - if _, ok := addr.AddLength(uint64(len(e)) * itemLen); !ok { + buffLen := len(e) * itemLen + if _, ok := addr.AddLength(uint64(buffLen)); !ok { return syserror.EFAULT } - b := t.CopyScratchBuffer(itemLen) + b := t.CopyScratchBuffer(buffLen) for i := range e { - usermem.ByteOrder.PutUint32(b[0:], e[i].Events) - usermem.ByteOrder.PutUint32(b[4:], uint32(e[i].Data[0])) - usermem.ByteOrder.PutUint32(b[8:], uint32(e[i].Data[1])) - if _, err := t.CopyOutBytes(addr, b); err != nil { - return err - } - addr += itemLen + usermem.ByteOrder.PutUint32(b[i*itemLen:], e[i].Events) + usermem.ByteOrder.PutUint32(b[i*itemLen+4:], uint32(e[i].Data[0])) + usermem.ByteOrder.PutUint32(b[i*itemLen+8:], uint32(e[i].Data[1])) + } + + if _, err := t.CopyOutBytes(addr, b); err != nil { + return err } return nil |