forked from quic-go/quic-go
check the length of IPv4 packet info control messages, add log message (#3920)
This commit is contained in:
@@ -6,8 +6,10 @@ import (
|
||||
"encoding/binary"
|
||||
"errors"
|
||||
"fmt"
|
||||
"log"
|
||||
"net"
|
||||
"net/netip"
|
||||
"sync"
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
@@ -149,6 +151,8 @@ func newConn(c OOBCapablePacketConn, supportsDF bool) (*oobConn, error) {
|
||||
return oobConn, nil
|
||||
}
|
||||
|
||||
var invalidCmsgOnceV4, invalidCmsgOnceV6 sync.Once
|
||||
|
||||
func (c *oobConn) ReadPacket() (receivedPacket, error) {
|
||||
if len(c.messages) == int(c.readPos) { // all messages read. Read the next batch of messages.
|
||||
c.messages = c.messages[:batchSize]
|
||||
@@ -189,21 +193,16 @@ func (c *oobConn) ReadPacket() (receivedPacket, error) {
|
||||
case msgTypeIPTOS:
|
||||
p.ecn = protocol.ECN(body[0] & ecnMask)
|
||||
case ipv4PKTINFO:
|
||||
// struct in_pktinfo {
|
||||
// unsigned int ipi_ifindex; /* Interface index */
|
||||
// struct in_addr ipi_spec_dst; /* Local address */
|
||||
// struct in_addr ipi_addr; /* Header Destination
|
||||
// address */
|
||||
// };
|
||||
var ip [4]byte
|
||||
if len(body) == 12 {
|
||||
copy(ip[:], body[8:12])
|
||||
p.info.ifIndex = binary.LittleEndian.Uint32(body)
|
||||
} else if len(body) == 4 {
|
||||
// FreeBSD
|
||||
copy(ip[:], body)
|
||||
ip, ifIndex, ok := parseIPv4PktInfo(body)
|
||||
if ok {
|
||||
p.info.addr = ip
|
||||
p.info.ifIndex = ifIndex
|
||||
} else {
|
||||
invalidCmsgOnceV4.Do(func() {
|
||||
log.Printf("Received invalid IPv4 packet info control message: %+x. "+
|
||||
"This should never occur, please open a new issue and include details about the architecture.", body)
|
||||
})
|
||||
}
|
||||
p.info.addr = netip.AddrFrom4(ip)
|
||||
}
|
||||
}
|
||||
if hdr.Level == unix.IPPROTO_IPV6 {
|
||||
@@ -216,10 +215,13 @@ func (c *oobConn) ReadPacket() (receivedPacket, error) {
|
||||
// unsigned int ipi6_ifindex; /* send/recv interface index */
|
||||
// };
|
||||
if len(body) == 20 {
|
||||
var ip [16]byte
|
||||
copy(ip[:], body[:16])
|
||||
p.info.addr = netip.AddrFrom16(ip)
|
||||
p.info.addr = netip.AddrFrom16(*(*[16]byte)(body[:16]))
|
||||
p.info.ifIndex = binary.LittleEndian.Uint32(body[16:])
|
||||
} else {
|
||||
invalidCmsgOnceV6.Do(func() {
|
||||
log.Printf("Received invalid IPv6 packet info control message: %+x. "+
|
||||
"This should never occur, please open a new issue and include details about the architecture.", body)
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user