Merge pull request #560 from Arceliar/bugfix

Packet length checks and logging
This commit is contained in:
Arceliar 2019-09-26 18:19:39 -05:00 committed by GitHub
commit 2b8b7118df
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 9 additions and 2 deletions

View File

@ -148,6 +148,11 @@ func (tun *TunAdapter) _handlePacket(recvd []byte, err error) {
// Offset the buffer from now on so that we can ignore ethernet frames if // Offset the buffer from now on so that we can ignore ethernet frames if
// they are present // they are present
bs := recvd[offset:] bs := recvd[offset:]
// Check if the packet is long enough to detect if it's an ICMP packet or not
if len(bs) < 7 {
tun.log.Traceln("TUN/TAP iface read undersized unknown packet, length:", len(bs))
return
}
// If we detect an ICMP packet then hand it to the ICMPv6 module // If we detect an ICMP packet then hand it to the ICMPv6 module
if bs[6] == 58 { if bs[6] == 58 {
// Found an ICMPv6 packet - we need to make sure to give ICMPv6 the full // Found an ICMPv6 packet - we need to make sure to give ICMPv6 the full
@ -175,6 +180,7 @@ func (tun *TunAdapter) _handlePacket(recvd []byte, err error) {
if bs[0]&0xf0 == 0x60 { if bs[0]&0xf0 == 0x60 {
// Check if we have a fully-sized IPv6 header // Check if we have a fully-sized IPv6 header
if len(bs) < 40 { if len(bs) < 40 {
tun.log.Traceln("TUN/TAP iface read undersized ipv6 packet, length:", len(bs))
return return
} }
// Check the packet size // Check the packet size
@ -188,6 +194,7 @@ func (tun *TunAdapter) _handlePacket(recvd []byte, err error) {
} else if bs[0]&0xf0 == 0x40 { } else if bs[0]&0xf0 == 0x40 {
// Check if we have a fully-sized IPv4 header // Check if we have a fully-sized IPv4 header
if len(bs) < 20 { if len(bs) < 20 {
tun.log.Traceln("TUN/TAP iface read undersized ipv4 packet, length:", len(bs))
return return
} }
// Check the packet size // Check the packet size

View File

@ -11,8 +11,8 @@ import (
// This is and is similar to a context, but with an error to specify the reason for the cancellation. // This is and is similar to a context, but with an error to specify the reason for the cancellation.
type Cancellation interface { type Cancellation interface {
Finished() <-chan struct{} // Finished returns a channel which will be closed when Cancellation.Cancel is first called. Finished() <-chan struct{} // Finished returns a channel which will be closed when Cancellation.Cancel is first called.
Cancel(error) error // Cancel closes the channel returned by Finished and sets the error returned by error, or else returns the existing error if the Cancellation has already run. Cancel(error) error // Cancel closes the channel returned by Finished and sets the error returned by error, or else returns the existing error if the Cancellation has already run.
Error() error // Error returns the error provided to Cancel, or nil if no error has been provided. Error() error // Error returns the error provided to Cancel, or nil if no error has been provided.
} }
// CancellationFinalized is an error returned if a cancellation object was garbage collected and the finalizer was run. // CancellationFinalized is an error returned if a cancellation object was garbage collected and the finalizer was run.