diff options
author | Ian Gudger <igudger@google.com> | 2019-04-18 11:50:26 -0700 |
---|---|---|
committer | Shentubot <shentubot@google.com> | 2019-04-18 11:51:41 -0700 |
commit | 133700007a8495c7d8df53801b1d34345d6c5cf8 (patch) | |
tree | 36e95255f49cb1bc56a7e166233240cc0fed2465 /pkg | |
parent | 4524790ff668674149ad6ae6eec805369be0c6e3 (diff) |
Only emit unimplemented syscall events for unsupported values.
Only emit unimplemented syscall events for setting SO_OOBINLINE and SO_LINGER
when attempting to set unsupported values.
PiperOrigin-RevId: 244229675
Change-Id: Icc4562af8f733dd75a90404621711f01a32a9fc1
Diffstat (limited to 'pkg')
-rw-r--r-- | pkg/abi/linux/socket.go | 13 | ||||
-rw-r--r-- | pkg/sentry/socket/epsocket/epsocket.go | 31 |
2 files changed, 40 insertions, 4 deletions
diff --git a/pkg/abi/linux/socket.go b/pkg/abi/linux/socket.go index 906776525..6fa4e7c3e 100644 --- a/pkg/abi/linux/socket.go +++ b/pkg/abi/linux/socket.go @@ -247,6 +247,15 @@ type SockAddrUnix struct { Path [UnixPathMax]int8 } +// Linger is struct linger, from include/linux/socket.h. +type Linger struct { + OnOff int32 + Linger int32 +} + +// SizeOfLinger is the binary size of a Linger struct. +const SizeOfLinger = 8 + // TCPInfo is a collection of TCP statistics. // // From uapi/linux/tcp.h. @@ -322,8 +331,8 @@ type TCPInfo struct { SndBufLimited uint64 } -// SizeOfTCPInfo is the binary size of a TCPInfo struct (104 bytes). -var SizeOfTCPInfo = binary.Size(TCPInfo{}) +// SizeOfTCPInfo is the binary size of a TCPInfo struct. +const SizeOfTCPInfo = 104 // Control message types, from linux/socket.h. const ( diff --git a/pkg/sentry/socket/epsocket/epsocket.go b/pkg/sentry/socket/epsocket/epsocket.go index 78f43178f..f370b803b 100644 --- a/pkg/sentry/socket/epsocket/epsocket.go +++ b/pkg/sentry/socket/epsocket/epsocket.go @@ -783,10 +783,10 @@ func getSockOptSocket(t *kernel.Task, s socket.Socket, ep commonEndpoint, family return int32(v), nil case linux.SO_LINGER: - if outLen < syscall.SizeofLinger { + if outLen < linux.SizeOfLinger { return nil, syserr.ErrInvalidArgument } - return syscall.Linger{}, nil + return linux.Linger{}, nil case linux.SO_SNDTIMEO: // TODO: Linux allows shorter lengths for partial results. @@ -1126,6 +1126,33 @@ func setSockOptSocket(t *kernel.Task, s socket.Socket, ep commonEndpoint, name i s.SetRecvTimeout(v.ToNsecCapped()) return nil + case linux.SO_OOBINLINE: + if len(optVal) < sizeOfInt32 { + return syserr.ErrInvalidArgument + } + + v := usermem.ByteOrder.Uint32(optVal) + + if v == 0 { + socket.SetSockOptEmitUnimplementedEvent(t, name) + } + + return syserr.TranslateNetstackError(ep.SetSockOpt(tcpip.OutOfBandInlineOption(v))) + + case linux.SO_LINGER: + if len(optVal) < linux.SizeOfLinger { + return syserr.ErrInvalidArgument + } + + var v linux.Linger + binary.Unmarshal(optVal[:linux.SizeOfLinger], usermem.ByteOrder, &v) + + if v != (linux.Linger{}) { + socket.SetSockOptEmitUnimplementedEvent(t, name) + } + + return nil + default: socket.SetSockOptEmitUnimplementedEvent(t, name) } |