mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Rpcinet is incorrectly handling MSG_TRUNC with SOCK_STREAM
SOCK_STREAM has special behavior with respect to MSG_TRUNC. Specifically, the data isn't actually copied back out to userspace when MSG_TRUNC is provided on a SOCK_STREAM. According to tcp(7): "Since version 2.4, Linux supports the use of MSG_TRUNC in the flags argument of recv(2) (and recvmsg(2)). This flag causes the received bytes of data to be discarded, rather than passed back in a caller-supplied buffer." PiperOrigin-RevId: 200134860 Change-Id: I70f17a5f60ffe7794c3f0cfafd131c069202e90d
This commit is contained in:
@@ -465,9 +465,13 @@ func (s *socketOperations) RecvMsg(t *kernel.Task, dst usermem.IOSequence, flags
|
||||
|
||||
res, err := rpcRecvMsg(t, req)
|
||||
if err == nil {
|
||||
n, e := dst.CopyOut(t, res.Data)
|
||||
if e == nil && n != len(res.Data) {
|
||||
panic("CopyOut failed to copy full buffer")
|
||||
var e error
|
||||
var n int
|
||||
if len(res.Data) > 0 {
|
||||
n, e = dst.CopyOut(t, res.Data)
|
||||
if e == nil && n != len(res.Data) {
|
||||
panic("CopyOut failed to copy full buffer")
|
||||
}
|
||||
}
|
||||
return int(res.Length), res.Address.GetAddress(), res.Address.GetLength(), socket.ControlMessages{}, syserr.FromError(e)
|
||||
}
|
||||
@@ -484,9 +488,13 @@ func (s *socketOperations) RecvMsg(t *kernel.Task, dst usermem.IOSequence, flags
|
||||
for {
|
||||
res, err := rpcRecvMsg(t, req)
|
||||
if err == nil {
|
||||
n, e := dst.CopyOut(t, res.Data)
|
||||
if e == nil && n != len(res.Data) {
|
||||
panic("CopyOut failed to copy full buffer")
|
||||
var e error
|
||||
var n int
|
||||
if len(res.Data) > 0 {
|
||||
n, e = dst.CopyOut(t, res.Data)
|
||||
if e == nil && n != len(res.Data) {
|
||||
panic("CopyOut failed to copy full buffer")
|
||||
}
|
||||
}
|
||||
return int(res.Length), res.Address.GetAddress(), res.Address.GetLength(), socket.ControlMessages{}, syserr.FromError(e)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user