Fix recvMMsgDispatcher not slicing link header correctly.

PiperOrigin-RevId: 321035635
This commit is contained in:
Ting-Yu Wang
2020-07-13 14:36:38 -07:00
committed by gVisor bot
parent 28c635e5d4
commit a287309d9f
2 changed files with 74 additions and 1 deletions
+73
View File
@@ -500,3 +500,76 @@ func TestRecvMMsgDispatcherCapLength(t *testing.T) {
}
}
// fakeNetworkDispatcher delivers packets to pkts.
type fakeNetworkDispatcher struct {
pkts []*stack.PacketBuffer
}
func (d *fakeNetworkDispatcher) DeliverNetworkPacket(remote, local tcpip.LinkAddress, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer) {
d.pkts = append(d.pkts, pkt)
}
func TestDispatchPacketFormat(t *testing.T) {
for _, test := range []struct {
name string
newDispatcher func(fd int, e *endpoint) (linkDispatcher, error)
}{
{
name: "readVDispatcher",
newDispatcher: newReadVDispatcher,
},
{
name: "recvMMsgDispatcher",
newDispatcher: newRecvMMsgDispatcher,
},
} {
t.Run(test.name, func(t *testing.T) {
// Create a socket pair to send/recv.
fds, err := syscall.Socketpair(syscall.AF_UNIX, syscall.SOCK_DGRAM, 0)
if err != nil {
t.Fatal(err)
}
defer syscall.Close(fds[0])
defer syscall.Close(fds[1])
data := []byte{
// Ethernet header.
1, 2, 3, 4, 5, 60,
1, 2, 3, 4, 5, 61,
8, 0,
// Mock network header.
40, 41, 42, 43,
}
err = syscall.Sendmsg(fds[1], data, nil, nil, 0)
if err != nil {
t.Fatal(err)
}
// Create and run dispatcher once.
sink := &fakeNetworkDispatcher{}
d, err := test.newDispatcher(fds[0], &endpoint{
hdrSize: header.EthernetMinimumSize,
dispatcher: sink,
})
if err != nil {
t.Fatal(err)
}
if ok, err := d.dispatch(); !ok || err != nil {
t.Fatalf("d.dispatch() = %v, %v", ok, err)
}
// Verify packet.
if got, want := len(sink.pkts), 1; got != want {
t.Fatalf("len(sink.pkts) = %d, want %d", got, want)
}
pkt := sink.pkts[0]
if got, want := len(pkt.LinkHeader), header.EthernetMinimumSize; got != want {
t.Errorf("len(pkt.LinkHeader) = %d, want %d", got, want)
}
if got, want := pkt.Data.Size(), 4; got != want {
t.Errorf("pkt.Data.Size() = %d, want %d", got, want)
}
})
}
}
+1 -1
View File
@@ -278,7 +278,7 @@ func (d *recvMMsgDispatcher) dispatch() (bool, *tcpip.Error) {
eth header.Ethernet
)
if d.e.hdrSize > 0 {
eth = header.Ethernet(d.views[k][0])
eth = header.Ethernet(d.views[k][0][:header.EthernetMinimumSize])
p = eth.Type()
remote = eth.SourceAddress()
local = eth.DestinationAddress()