Fix ipv4 header ownership.

PiperOrigin-RevId: 487369872
This commit is contained in:
Lucas Manning
2022-11-09 16:00:24 -08:00
committed by gVisor bot
parent ead2fa0810
commit e038ca2a1c
2 changed files with 14 additions and 9 deletions
+12 -5
View File
@@ -22,6 +22,7 @@ import (
"time"
"gvisor.dev/gvisor/pkg/atomicbitops"
"gvisor.dev/gvisor/pkg/bufferv2"
"gvisor.dev/gvisor/pkg/sync"
"gvisor.dev/gvisor/pkg/tcpip"
"gvisor.dev/gvisor/pkg/tcpip/header"
@@ -697,7 +698,9 @@ func (e *endpoint) forwardPacketWithRoute(route *stack.Route, pkt stack.PacketBu
// forwardUnicastPacket attempts to forward a packet to its final destination.
func (e *endpoint) forwardUnicastPacket(pkt stack.PacketBufferPtr) ip.ForwardingError {
h := header.IPv4(pkt.NetworkHeader().Slice())
hView := pkt.NetworkHeader().View()
defer hView.Release()
h := header.IPv4(hView.AsSlice())
dstAddr := h.DestinationAddress()
@@ -782,11 +785,13 @@ func (e *endpoint) HandlePacket(pkt stack.PacketBufferPtr) {
return
}
h, ok := e.protocol.parseAndValidate(pkt)
hView, ok := e.protocol.parseAndValidate(pkt)
if !ok {
stats.MalformedPacketsReceived.Increment()
return
}
h := header.IPv4(hView.AsSlice())
defer hView.Release()
if !e.nic.IsLoopback() {
if !e.protocol.options.AllowExternalLoopbackTraffic {
@@ -837,11 +842,13 @@ func (e *endpoint) handleLocalPacket(pkt stack.PacketBufferPtr, canSkipRXChecksu
defer pkt.DecRef()
pkt.RXChecksumValidated = canSkipRXChecksum
h, ok := e.protocol.parseAndValidate(pkt)
hView, ok := e.protocol.parseAndValidate(pkt)
if !ok {
stats.MalformedPacketsReceived.Increment()
return
}
h := header.IPv4(hView.AsSlice())
defer hView.Release()
e.handleValidatedPacket(h, pkt, e.nic.Name() /* inNICName */)
}
@@ -1692,7 +1699,7 @@ func (p *protocol) isSubnetLocalBroadcastAddress(addr tcpip.Address) bool {
// returns the parsed IP header.
//
// Returns true if the IP header was successfully parsed.
func (p *protocol) parseAndValidate(pkt stack.PacketBufferPtr) (header.IPv4, bool) {
func (p *protocol) parseAndValidate(pkt stack.PacketBufferPtr) (*bufferv2.View, bool) {
transProtoNum, hasTransportHdr, ok := p.Parse(pkt)
if !ok {
return nil, false
@@ -1713,7 +1720,7 @@ func (p *protocol) parseAndValidate(pkt stack.PacketBufferPtr) (header.IPv4, boo
p.parseTransport(pkt, transProtoNum)
}
return h, true
return pkt.NetworkHeader().View(), true
}
func (p *protocol) parseTransport(pkt stack.PacketBufferPtr, transProtoNum tcpip.TransportProtocolNumber) {
+2 -4
View File
@@ -2551,12 +2551,10 @@ func (p *protocol) parseAndValidate(pkt stack.PacketBufferPtr) (*bufferv2.View,
return nil, false
}
hView := pkt.NetworkHeader().View()
h := header.IPv6(hView.AsSlice())
h := header.IPv6(pkt.NetworkHeader().Slice())
// Do not include the link header's size when calculating the size of the IP
// packet.
if !h.IsValid(pkt.Size() - len(pkt.LinkHeader().Slice())) {
hView.Release()
return nil, false
}
@@ -2564,7 +2562,7 @@ func (p *protocol) parseAndValidate(pkt stack.PacketBufferPtr) (*bufferv2.View,
p.parseTransport(pkt, transProtoNum)
}
return hView, true
return pkt.NetworkHeader().View(), true
}
func (p *protocol) parseTransport(pkt stack.PacketBufferPtr, transProtoNum tcpip.TransportProtocolNumber) {