mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Remove uses of the binary package from networking code.
Co-Author: ayushranjan PiperOrigin-RevId: 370785009
This commit is contained in:
committed by
gVisor bot
parent
9ec49aabd3
commit
f54d87b9ec
@@ -245,6 +245,8 @@ const SizeOfXTCounters = 16
|
||||
// include/uapi/linux/netfilter/x_tables.h. That struct contains a union
|
||||
// exposing different data to the user and kernel, but this struct holds only
|
||||
// the user data.
|
||||
//
|
||||
// +marshal
|
||||
type XTEntryMatch struct {
|
||||
MatchSize uint16
|
||||
Name ExtensionName
|
||||
@@ -284,6 +286,8 @@ const SizeOfXTGetRevision = 30
|
||||
// include/uapi/linux/netfilter/x_tables.h. That struct contains a union
|
||||
// exposing different data to the user and kernel, but this struct holds only
|
||||
// the user data.
|
||||
//
|
||||
// +marshal
|
||||
type XTEntryTarget struct {
|
||||
TargetSize uint16
|
||||
Name ExtensionName
|
||||
@@ -306,6 +310,8 @@ type KernelXTEntryTarget struct {
|
||||
// XTStandardTarget is a built-in target, one of ACCEPT, DROP, JUMP, QUEUE,
|
||||
// RETURN, or jump. It corresponds to struct xt_standard_target in
|
||||
// include/uapi/linux/netfilter/x_tables.h.
|
||||
//
|
||||
// +marshal
|
||||
type XTStandardTarget struct {
|
||||
Target XTEntryTarget
|
||||
// A positive verdict indicates a jump, and is the offset from the
|
||||
@@ -322,6 +328,8 @@ const SizeOfXTStandardTarget = 40
|
||||
// beginning of user-defined chains by putting the name of the chain in
|
||||
// ErrorName. It corresponds to struct xt_error_target in
|
||||
// include/uapi/linux/netfilter/x_tables.h.
|
||||
//
|
||||
// +marshal
|
||||
type XTErrorTarget struct {
|
||||
Target XTEntryTarget
|
||||
Name ErrorName
|
||||
@@ -349,6 +357,8 @@ const (
|
||||
// NfNATIPV4Range corresponds to struct nf_nat_ipv4_range
|
||||
// in include/uapi/linux/netfilter/nf_nat.h. The fields are in
|
||||
// network byte order.
|
||||
//
|
||||
// +marshal
|
||||
type NfNATIPV4Range struct {
|
||||
Flags uint32
|
||||
MinIP [4]byte
|
||||
@@ -359,6 +369,8 @@ type NfNATIPV4Range struct {
|
||||
|
||||
// NfNATIPV4MultiRangeCompat corresponds to struct
|
||||
// nf_nat_ipv4_multi_range_compat in include/uapi/linux/netfilter/nf_nat.h.
|
||||
//
|
||||
// +marshal
|
||||
type NfNATIPV4MultiRangeCompat struct {
|
||||
RangeSize uint32
|
||||
RangeIPV4 NfNATIPV4Range
|
||||
@@ -366,6 +378,8 @@ type NfNATIPV4MultiRangeCompat struct {
|
||||
|
||||
// XTRedirectTarget triggers a redirect when reached.
|
||||
// Adding 4 bytes of padding to make the struct 8 byte aligned.
|
||||
//
|
||||
// +marshal
|
||||
type XTRedirectTarget struct {
|
||||
Target XTEntryTarget
|
||||
NfRange NfNATIPV4MultiRangeCompat
|
||||
@@ -377,6 +391,8 @@ const SizeOfXTRedirectTarget = 56
|
||||
|
||||
// XTSNATTarget triggers Source NAT when reached.
|
||||
// Adding 4 bytes of padding to make the struct 8 byte aligned.
|
||||
//
|
||||
// +marshal
|
||||
type XTSNATTarget struct {
|
||||
Target XTEntryTarget
|
||||
NfRange NfNATIPV4MultiRangeCompat
|
||||
@@ -463,6 +479,8 @@ var _ marshal.Marshallable = (*KernelIPTGetEntries)(nil)
|
||||
// IPTReplace is the argument for the IPT_SO_SET_REPLACE sockopt. It
|
||||
// corresponds to struct ipt_replace in
|
||||
// include/uapi/linux/netfilter_ipv4/ip_tables.h.
|
||||
//
|
||||
// +marshal
|
||||
type IPTReplace struct {
|
||||
Name TableName
|
||||
ValidHooks uint32
|
||||
@@ -502,6 +520,8 @@ func (tn TableName) String() string {
|
||||
|
||||
// ErrorName holds the name of a netfilter error. These can also hold
|
||||
// user-defined chains.
|
||||
//
|
||||
// +marshal
|
||||
type ErrorName [XT_FUNCTION_MAXNAMELEN]byte
|
||||
|
||||
// String implements fmt.Stringer.
|
||||
@@ -520,6 +540,8 @@ func goString(cstring []byte) string {
|
||||
|
||||
// XTTCP holds data for matching TCP packets. It corresponds to struct xt_tcp
|
||||
// in include/uapi/linux/netfilter/xt_tcpudp.h.
|
||||
//
|
||||
// +marshal
|
||||
type XTTCP struct {
|
||||
// SourcePortStart specifies the inclusive start of the range of source
|
||||
// ports to which the matcher applies.
|
||||
@@ -573,6 +595,8 @@ const (
|
||||
|
||||
// XTUDP holds data for matching UDP packets. It corresponds to struct xt_udp
|
||||
// in include/uapi/linux/netfilter/xt_tcpudp.h.
|
||||
//
|
||||
// +marshal
|
||||
type XTUDP struct {
|
||||
// SourcePortStart is the inclusive start of the range of source ports
|
||||
// to which the matcher applies.
|
||||
@@ -613,6 +637,8 @@ const (
|
||||
|
||||
// IPTOwnerInfo holds data for matching packets with owner. It corresponds
|
||||
// to struct ipt_owner_info in libxt_owner.c of iptables binary.
|
||||
//
|
||||
// +marshal
|
||||
type IPTOwnerInfo struct {
|
||||
// UID is user id which created the packet.
|
||||
UID uint32
|
||||
@@ -634,7 +660,7 @@ type IPTOwnerInfo struct {
|
||||
Match uint8
|
||||
|
||||
// Invert flips the meaning of Match field.
|
||||
Invert uint8
|
||||
Invert uint8 `marshal:"unaligned"`
|
||||
}
|
||||
|
||||
// SizeOfIPTOwnerInfo is the size of an XTOwnerMatchInfo.
|
||||
|
||||
@@ -264,6 +264,8 @@ const (
|
||||
|
||||
// NFNATRange corresponds to struct nf_nat_range in
|
||||
// include/uapi/linux/netfilter/nf_nat.h.
|
||||
//
|
||||
// +marshal
|
||||
type NFNATRange struct {
|
||||
Flags uint32
|
||||
MinAddr Inet6Addr
|
||||
|
||||
@@ -53,6 +53,8 @@ type SockAddrNetlink struct {
|
||||
const SockAddrNetlinkSize = 12
|
||||
|
||||
// NetlinkMessageHeader is struct nlmsghdr, from uapi/linux/netlink.h.
|
||||
//
|
||||
// +marshal
|
||||
type NetlinkMessageHeader struct {
|
||||
Length uint32
|
||||
Type uint16
|
||||
@@ -99,6 +101,8 @@ const NLMSG_ALIGNTO = 4
|
||||
// NetlinkAttrHeader is the header of a netlink attribute, followed by payload.
|
||||
//
|
||||
// This is struct nlattr, from uapi/linux/netlink.h.
|
||||
//
|
||||
// +marshal
|
||||
type NetlinkAttrHeader struct {
|
||||
Length uint16
|
||||
Type uint16
|
||||
@@ -126,6 +130,8 @@ const (
|
||||
)
|
||||
|
||||
// NetlinkErrorMessage is struct nlmsgerr, from uapi/linux/netlink.h.
|
||||
//
|
||||
// +marshal
|
||||
type NetlinkErrorMessage struct {
|
||||
Error int32
|
||||
Header NetlinkMessageHeader
|
||||
|
||||
@@ -85,6 +85,8 @@ const (
|
||||
)
|
||||
|
||||
// InterfaceInfoMessage is struct ifinfomsg, from uapi/linux/rtnetlink.h.
|
||||
//
|
||||
// +marshal
|
||||
type InterfaceInfoMessage struct {
|
||||
Family uint8
|
||||
_ uint8
|
||||
@@ -164,6 +166,8 @@ const (
|
||||
)
|
||||
|
||||
// InterfaceAddrMessage is struct ifaddrmsg, from uapi/linux/if_addr.h.
|
||||
//
|
||||
// +marshal
|
||||
type InterfaceAddrMessage struct {
|
||||
Family uint8
|
||||
PrefixLen uint8
|
||||
@@ -193,6 +197,8 @@ const (
|
||||
)
|
||||
|
||||
// RouteMessage is struct rtmsg, from uapi/linux/rtnetlink.h.
|
||||
//
|
||||
// +marshal
|
||||
type RouteMessage struct {
|
||||
Family uint8
|
||||
DstLen uint8
|
||||
|
||||
+12
-4
@@ -15,7 +15,6 @@
|
||||
package linux
|
||||
|
||||
import (
|
||||
"gvisor.dev/gvisor/pkg/binary"
|
||||
"gvisor.dev/gvisor/pkg/marshal"
|
||||
)
|
||||
|
||||
@@ -251,18 +250,24 @@ type SockAddrInet struct {
|
||||
}
|
||||
|
||||
// Inet6MulticastRequest is struct ipv6_mreq, from uapi/linux/in6.h.
|
||||
//
|
||||
// +marshal
|
||||
type Inet6MulticastRequest struct {
|
||||
MulticastAddr Inet6Addr
|
||||
InterfaceIndex int32
|
||||
}
|
||||
|
||||
// InetMulticastRequest is struct ip_mreq, from uapi/linux/in.h.
|
||||
//
|
||||
// +marshal
|
||||
type InetMulticastRequest struct {
|
||||
MulticastAddr InetAddr
|
||||
InterfaceAddr InetAddr
|
||||
}
|
||||
|
||||
// InetMulticastRequestWithNIC is struct ip_mreqn, from uapi/linux/in.h.
|
||||
//
|
||||
// +marshal
|
||||
type InetMulticastRequestWithNIC struct {
|
||||
InetMulticastRequest
|
||||
InterfaceIndex int32
|
||||
@@ -491,7 +496,7 @@ type TCPInfo struct {
|
||||
}
|
||||
|
||||
// SizeOfTCPInfo is the binary size of a TCPInfo struct.
|
||||
var SizeOfTCPInfo = int(binary.Size(TCPInfo{}))
|
||||
var SizeOfTCPInfo = (*TCPInfo)(nil).SizeBytes()
|
||||
|
||||
// Control message types, from linux/socket.h.
|
||||
const (
|
||||
@@ -502,6 +507,8 @@ const (
|
||||
// A ControlMessageHeader is the header for a socket control message.
|
||||
//
|
||||
// ControlMessageHeader represents struct cmsghdr from linux/socket.h.
|
||||
//
|
||||
// +marshal
|
||||
type ControlMessageHeader struct {
|
||||
Length uint64
|
||||
Level int32
|
||||
@@ -510,7 +517,7 @@ type ControlMessageHeader struct {
|
||||
|
||||
// SizeOfControlMessageHeader is the binary size of a ControlMessageHeader
|
||||
// struct.
|
||||
var SizeOfControlMessageHeader = int(binary.Size(ControlMessageHeader{}))
|
||||
var SizeOfControlMessageHeader = (*ControlMessageHeader)(nil).SizeBytes()
|
||||
|
||||
// A ControlMessageCredentials is an SCM_CREDENTIALS socket control message.
|
||||
//
|
||||
@@ -527,6 +534,7 @@ type ControlMessageCredentials struct {
|
||||
//
|
||||
// ControlMessageIPPacketInfo represents struct in_pktinfo from linux/in.h.
|
||||
//
|
||||
// +marshal
|
||||
// +stateify savable
|
||||
type ControlMessageIPPacketInfo struct {
|
||||
NIC int32
|
||||
@@ -536,7 +544,7 @@ type ControlMessageIPPacketInfo struct {
|
||||
|
||||
// SizeOfControlMessageCredentials is the binary size of a
|
||||
// ControlMessageCredentials struct.
|
||||
var SizeOfControlMessageCredentials = int(binary.Size(ControlMessageCredentials{}))
|
||||
var SizeOfControlMessageCredentials = (*ControlMessageCredentials)(nil).SizeBytes()
|
||||
|
||||
// A ControlMessageRights is an SCM_RIGHTS socket control message.
|
||||
type ControlMessageRights []int32
|
||||
|
||||
@@ -14,3 +14,13 @@
|
||||
|
||||
// Package bits includes all bit related types and operations.
|
||||
package bits
|
||||
|
||||
// AlignUp rounds a length up to an alignment. align must be a power of 2.
|
||||
func AlignUp(length int, align uint) int {
|
||||
return (length + int(align) - 1) & ^(int(align) - 1)
|
||||
}
|
||||
|
||||
// AlignDown rounds a length down to an alignment. align must be a power of 2.
|
||||
func AlignDown(length int, align uint) int {
|
||||
return length & ^(int(align) - 1)
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ go_library(
|
||||
srcs = [
|
||||
"marshal.go",
|
||||
"marshal_impl_util.go",
|
||||
"util.go",
|
||||
],
|
||||
visibility = [
|
||||
"//:sandbox",
|
||||
|
||||
@@ -125,6 +125,81 @@ func (b *ByteSlice) WriteTo(w io.Writer) (int64, error) {
|
||||
|
||||
var _ marshal.Marshallable = (*ByteSlice)(nil)
|
||||
|
||||
// The following set of functions are convenient shorthands for wrapping a
|
||||
// built-in type in a marshallable primitive type. For example:
|
||||
//
|
||||
// func useMarshallable(m marshal.Marshallable) { ... }
|
||||
//
|
||||
// // Compare:
|
||||
//
|
||||
// buf = []byte{...}
|
||||
// // useMarshallable(&primitive.ByteSlice(buf)) // Not allowed, can't address temp value.
|
||||
// bufP := primitive.ByteSlice(buf)
|
||||
// useMarshallable(&bufP)
|
||||
//
|
||||
// // Vs:
|
||||
//
|
||||
// useMarshallable(AsByteSlice(buf))
|
||||
//
|
||||
// Note that the argument to these function escapes, so avoid using them on very
|
||||
// hot code paths. But generally if a function accepts an interface as an
|
||||
// argument, the argument escapes anyways.
|
||||
|
||||
// AllocateInt8 returns x as a marshallable.
|
||||
func AllocateInt8(x int8) marshal.Marshallable {
|
||||
p := Int8(x)
|
||||
return &p
|
||||
}
|
||||
|
||||
// AllocateUint8 returns x as a marshallable.
|
||||
func AllocateUint8(x uint8) marshal.Marshallable {
|
||||
p := Uint8(x)
|
||||
return &p
|
||||
}
|
||||
|
||||
// AllocateInt16 returns x as a marshallable.
|
||||
func AllocateInt16(x int16) marshal.Marshallable {
|
||||
p := Int16(x)
|
||||
return &p
|
||||
}
|
||||
|
||||
// AllocateUint16 returns x as a marshallable.
|
||||
func AllocateUint16(x uint16) marshal.Marshallable {
|
||||
p := Uint16(x)
|
||||
return &p
|
||||
}
|
||||
|
||||
// AllocateInt32 returns x as a marshallable.
|
||||
func AllocateInt32(x int32) marshal.Marshallable {
|
||||
p := Int32(x)
|
||||
return &p
|
||||
}
|
||||
|
||||
// AllocateUint32 returns x as a marshallable.
|
||||
func AllocateUint32(x uint32) marshal.Marshallable {
|
||||
p := Uint32(x)
|
||||
return &p
|
||||
}
|
||||
|
||||
// AllocateInt64 returns x as a marshallable.
|
||||
func AllocateInt64(x int64) marshal.Marshallable {
|
||||
p := Int64(x)
|
||||
return &p
|
||||
}
|
||||
|
||||
// AllocateUint64 returns x as a marshallable.
|
||||
func AllocateUint64(x uint64) marshal.Marshallable {
|
||||
p := Uint64(x)
|
||||
return &p
|
||||
}
|
||||
|
||||
// AsByteSlice returns b as a marshallable. Note that this allocates a new slice
|
||||
// header, but does not copy the slice contents.
|
||||
func AsByteSlice(b []byte) marshal.Marshallable {
|
||||
bs := ByteSlice(b)
|
||||
return &bs
|
||||
}
|
||||
|
||||
// Below, we define some convenience functions for marshalling primitive types
|
||||
// using the newtypes above, without requiring superfluous casts.
|
||||
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
// Copyright 2020 The gVisor Authors.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package marshal
|
||||
|
||||
// Marshal returns the serialized contents of m in a newly allocated
|
||||
// byte slice.
|
||||
func Marshal(m Marshallable) []byte {
|
||||
buf := make([]byte, m.SizeBytes())
|
||||
m.MarshalUnsafe(buf)
|
||||
return buf
|
||||
}
|
||||
@@ -8,7 +8,6 @@ go_library(
|
||||
visibility = ["//pkg/sentry:internal"],
|
||||
deps = [
|
||||
"//pkg/abi/linux",
|
||||
"//pkg/binary",
|
||||
"//pkg/context",
|
||||
"//pkg/hostarch",
|
||||
"//pkg/marshal",
|
||||
|
||||
@@ -14,9 +14,11 @@ go_library(
|
||||
visibility = ["//pkg/sentry:internal"],
|
||||
deps = [
|
||||
"//pkg/abi/linux",
|
||||
"//pkg/binary",
|
||||
"//pkg/bits",
|
||||
"//pkg/context",
|
||||
"//pkg/hostarch",
|
||||
"//pkg/marshal",
|
||||
"//pkg/marshal/primitive",
|
||||
"//pkg/sentry/fs",
|
||||
"//pkg/sentry/kernel",
|
||||
"//pkg/sentry/kernel/auth",
|
||||
|
||||
@@ -18,9 +18,11 @@ package control
|
||||
|
||||
import (
|
||||
"gvisor.dev/gvisor/pkg/abi/linux"
|
||||
"gvisor.dev/gvisor/pkg/binary"
|
||||
"gvisor.dev/gvisor/pkg/bits"
|
||||
"gvisor.dev/gvisor/pkg/context"
|
||||
"gvisor.dev/gvisor/pkg/hostarch"
|
||||
"gvisor.dev/gvisor/pkg/marshal"
|
||||
"gvisor.dev/gvisor/pkg/marshal/primitive"
|
||||
"gvisor.dev/gvisor/pkg/sentry/fs"
|
||||
"gvisor.dev/gvisor/pkg/sentry/kernel"
|
||||
"gvisor.dev/gvisor/pkg/sentry/kernel/auth"
|
||||
@@ -193,7 +195,7 @@ func putUint32(buf []byte, n uint32) []byte {
|
||||
// putCmsg writes a control message header and as much data as will fit into
|
||||
// the unused capacity of a buffer.
|
||||
func putCmsg(buf []byte, flags int, msgType uint32, align uint, data []int32) ([]byte, int) {
|
||||
space := binary.AlignDown(cap(buf)-len(buf), 4)
|
||||
space := bits.AlignDown(cap(buf)-len(buf), 4)
|
||||
|
||||
// We can't write to space that doesn't exist, so if we are going to align
|
||||
// the available space, we must align down.
|
||||
@@ -230,7 +232,7 @@ func putCmsg(buf []byte, flags int, msgType uint32, align uint, data []int32) ([
|
||||
return alignSlice(buf, align), flags
|
||||
}
|
||||
|
||||
func putCmsgStruct(buf []byte, msgLevel, msgType uint32, align uint, data interface{}) []byte {
|
||||
func putCmsgStruct(buf []byte, msgLevel, msgType uint32, align uint, data marshal.Marshallable) []byte {
|
||||
if cap(buf)-len(buf) < linux.SizeOfControlMessageHeader {
|
||||
return buf
|
||||
}
|
||||
@@ -241,8 +243,7 @@ func putCmsgStruct(buf []byte, msgLevel, msgType uint32, align uint, data interf
|
||||
buf = putUint32(buf, msgType)
|
||||
|
||||
hdrBuf := buf
|
||||
|
||||
buf = binary.Marshal(buf, hostarch.ByteOrder, data)
|
||||
buf = append(buf, marshal.Marshal(data)...)
|
||||
|
||||
// If the control message data brought us over capacity, omit it.
|
||||
if cap(buf) != cap(ob) {
|
||||
@@ -288,7 +289,7 @@ func PackCredentials(t *kernel.Task, creds SCMCredentials, buf []byte, flags int
|
||||
|
||||
// alignSlice extends a slice's length (up to the capacity) to align it.
|
||||
func alignSlice(buf []byte, align uint) []byte {
|
||||
aligned := binary.AlignUp(len(buf), align)
|
||||
aligned := bits.AlignUp(len(buf), align)
|
||||
if aligned > cap(buf) {
|
||||
// Linux allows unaligned data if there isn't room for alignment.
|
||||
// Since there isn't room for alignment, there isn't room for any
|
||||
@@ -300,12 +301,13 @@ func alignSlice(buf []byte, align uint) []byte {
|
||||
|
||||
// PackTimestamp packs a SO_TIMESTAMP socket control message.
|
||||
func PackTimestamp(t *kernel.Task, timestamp int64, buf []byte) []byte {
|
||||
timestampP := linux.NsecToTimeval(timestamp)
|
||||
return putCmsgStruct(
|
||||
buf,
|
||||
linux.SOL_SOCKET,
|
||||
linux.SO_TIMESTAMP,
|
||||
t.Arch().Width(),
|
||||
linux.NsecToTimeval(timestamp),
|
||||
×tampP,
|
||||
)
|
||||
}
|
||||
|
||||
@@ -316,7 +318,7 @@ func PackInq(t *kernel.Task, inq int32, buf []byte) []byte {
|
||||
linux.SOL_TCP,
|
||||
linux.TCP_INQ,
|
||||
t.Arch().Width(),
|
||||
inq,
|
||||
primitive.AllocateInt32(inq),
|
||||
)
|
||||
}
|
||||
|
||||
@@ -327,7 +329,7 @@ func PackTOS(t *kernel.Task, tos uint8, buf []byte) []byte {
|
||||
linux.SOL_IP,
|
||||
linux.IP_TOS,
|
||||
t.Arch().Width(),
|
||||
tos,
|
||||
primitive.AllocateUint8(tos),
|
||||
)
|
||||
}
|
||||
|
||||
@@ -338,7 +340,7 @@ func PackTClass(t *kernel.Task, tClass uint32, buf []byte) []byte {
|
||||
linux.SOL_IPV6,
|
||||
linux.IPV6_TCLASS,
|
||||
t.Arch().Width(),
|
||||
tClass,
|
||||
primitive.AllocateUint32(tClass),
|
||||
)
|
||||
}
|
||||
|
||||
@@ -423,7 +425,7 @@ func PackControlMessages(t *kernel.Task, cmsgs socket.ControlMessages, buf []byt
|
||||
|
||||
// cmsgSpace is equivalent to CMSG_SPACE in Linux.
|
||||
func cmsgSpace(t *kernel.Task, dataLen int) int {
|
||||
return linux.SizeOfControlMessageHeader + binary.AlignUp(dataLen, t.Arch().Width())
|
||||
return linux.SizeOfControlMessageHeader + bits.AlignUp(dataLen, t.Arch().Width())
|
||||
}
|
||||
|
||||
// CmsgsSpace returns the number of bytes needed to fit the control messages
|
||||
@@ -475,7 +477,7 @@ func Parse(t *kernel.Task, socketOrEndpoint interface{}, buf []byte, width uint)
|
||||
}
|
||||
|
||||
var h linux.ControlMessageHeader
|
||||
binary.Unmarshal(buf[i:i+linux.SizeOfControlMessageHeader], hostarch.ByteOrder, &h)
|
||||
h.UnmarshalUnsafe(buf[i : i+linux.SizeOfControlMessageHeader])
|
||||
|
||||
if h.Length < uint64(linux.SizeOfControlMessageHeader) {
|
||||
return socket.ControlMessages{}, syserror.EINVAL
|
||||
@@ -491,7 +493,7 @@ func Parse(t *kernel.Task, socketOrEndpoint interface{}, buf []byte, width uint)
|
||||
case linux.SOL_SOCKET:
|
||||
switch h.Type {
|
||||
case linux.SCM_RIGHTS:
|
||||
rightsSize := binary.AlignDown(length, linux.SizeOfControlMessageRight)
|
||||
rightsSize := bits.AlignDown(length, linux.SizeOfControlMessageRight)
|
||||
numRights := rightsSize / linux.SizeOfControlMessageRight
|
||||
|
||||
if len(fds)+numRights > linux.SCM_MAX_FD {
|
||||
@@ -502,7 +504,7 @@ func Parse(t *kernel.Task, socketOrEndpoint interface{}, buf []byte, width uint)
|
||||
fds = append(fds, int32(hostarch.ByteOrder.Uint32(buf[j:j+linux.SizeOfControlMessageRight])))
|
||||
}
|
||||
|
||||
i += binary.AlignUp(length, width)
|
||||
i += bits.AlignUp(length, width)
|
||||
|
||||
case linux.SCM_CREDENTIALS:
|
||||
if length < linux.SizeOfControlMessageCredentials {
|
||||
@@ -510,23 +512,23 @@ func Parse(t *kernel.Task, socketOrEndpoint interface{}, buf []byte, width uint)
|
||||
}
|
||||
|
||||
var creds linux.ControlMessageCredentials
|
||||
binary.Unmarshal(buf[i:i+linux.SizeOfControlMessageCredentials], hostarch.ByteOrder, &creds)
|
||||
creds.UnmarshalUnsafe(buf[i : i+linux.SizeOfControlMessageCredentials])
|
||||
scmCreds, err := NewSCMCredentials(t, creds)
|
||||
if err != nil {
|
||||
return socket.ControlMessages{}, err
|
||||
}
|
||||
cmsgs.Unix.Credentials = scmCreds
|
||||
i += binary.AlignUp(length, width)
|
||||
i += bits.AlignUp(length, width)
|
||||
|
||||
case linux.SO_TIMESTAMP:
|
||||
if length < linux.SizeOfTimeval {
|
||||
return socket.ControlMessages{}, syserror.EINVAL
|
||||
}
|
||||
var ts linux.Timeval
|
||||
binary.Unmarshal(buf[i:i+linux.SizeOfTimeval], hostarch.ByteOrder, &ts)
|
||||
ts.UnmarshalUnsafe(buf[i : i+linux.SizeOfTimeval])
|
||||
cmsgs.IP.Timestamp = ts.ToNsecCapped()
|
||||
cmsgs.IP.HasTimestamp = true
|
||||
i += binary.AlignUp(length, width)
|
||||
i += bits.AlignUp(length, width)
|
||||
|
||||
default:
|
||||
// Unknown message type.
|
||||
@@ -539,8 +541,10 @@ func Parse(t *kernel.Task, socketOrEndpoint interface{}, buf []byte, width uint)
|
||||
return socket.ControlMessages{}, syserror.EINVAL
|
||||
}
|
||||
cmsgs.IP.HasTOS = true
|
||||
binary.Unmarshal(buf[i:i+linux.SizeOfControlMessageTOS], hostarch.ByteOrder, &cmsgs.IP.TOS)
|
||||
i += binary.AlignUp(length, width)
|
||||
var tos primitive.Uint8
|
||||
tos.UnmarshalUnsafe(buf[i : i+linux.SizeOfControlMessageTOS])
|
||||
cmsgs.IP.TOS = uint8(tos)
|
||||
i += bits.AlignUp(length, width)
|
||||
|
||||
case linux.IP_PKTINFO:
|
||||
if length < linux.SizeOfControlMessageIPPacketInfo {
|
||||
@@ -549,19 +553,19 @@ func Parse(t *kernel.Task, socketOrEndpoint interface{}, buf []byte, width uint)
|
||||
|
||||
cmsgs.IP.HasIPPacketInfo = true
|
||||
var packetInfo linux.ControlMessageIPPacketInfo
|
||||
binary.Unmarshal(buf[i:i+linux.SizeOfControlMessageIPPacketInfo], hostarch.ByteOrder, &packetInfo)
|
||||
packetInfo.UnmarshalUnsafe(buf[i : i+linux.SizeOfControlMessageIPPacketInfo])
|
||||
|
||||
cmsgs.IP.PacketInfo = packetInfo
|
||||
i += binary.AlignUp(length, width)
|
||||
i += bits.AlignUp(length, width)
|
||||
|
||||
case linux.IP_RECVORIGDSTADDR:
|
||||
var addr linux.SockAddrInet
|
||||
if length < addr.SizeBytes() {
|
||||
return socket.ControlMessages{}, syserror.EINVAL
|
||||
}
|
||||
binary.Unmarshal(buf[i:i+addr.SizeBytes()], hostarch.ByteOrder, &addr)
|
||||
addr.UnmarshalUnsafe(buf[i : i+addr.SizeBytes()])
|
||||
cmsgs.IP.OriginalDstAddress = &addr
|
||||
i += binary.AlignUp(length, width)
|
||||
i += bits.AlignUp(length, width)
|
||||
|
||||
case linux.IP_RECVERR:
|
||||
var errCmsg linux.SockErrCMsgIPv4
|
||||
@@ -571,7 +575,7 @@ func Parse(t *kernel.Task, socketOrEndpoint interface{}, buf []byte, width uint)
|
||||
|
||||
errCmsg.UnmarshalBytes(buf[i : i+errCmsg.SizeBytes()])
|
||||
cmsgs.IP.SockErr = &errCmsg
|
||||
i += binary.AlignUp(length, width)
|
||||
i += bits.AlignUp(length, width)
|
||||
|
||||
default:
|
||||
return socket.ControlMessages{}, syserror.EINVAL
|
||||
@@ -583,17 +587,19 @@ func Parse(t *kernel.Task, socketOrEndpoint interface{}, buf []byte, width uint)
|
||||
return socket.ControlMessages{}, syserror.EINVAL
|
||||
}
|
||||
cmsgs.IP.HasTClass = true
|
||||
binary.Unmarshal(buf[i:i+linux.SizeOfControlMessageTClass], hostarch.ByteOrder, &cmsgs.IP.TClass)
|
||||
i += binary.AlignUp(length, width)
|
||||
var tclass primitive.Uint32
|
||||
tclass.UnmarshalUnsafe(buf[i : i+linux.SizeOfControlMessageTClass])
|
||||
cmsgs.IP.TClass = uint32(tclass)
|
||||
i += bits.AlignUp(length, width)
|
||||
|
||||
case linux.IPV6_RECVORIGDSTADDR:
|
||||
var addr linux.SockAddrInet6
|
||||
if length < addr.SizeBytes() {
|
||||
return socket.ControlMessages{}, syserror.EINVAL
|
||||
}
|
||||
binary.Unmarshal(buf[i:i+addr.SizeBytes()], hostarch.ByteOrder, &addr)
|
||||
addr.UnmarshalUnsafe(buf[i : i+addr.SizeBytes()])
|
||||
cmsgs.IP.OriginalDstAddress = &addr
|
||||
i += binary.AlignUp(length, width)
|
||||
i += bits.AlignUp(length, width)
|
||||
|
||||
case linux.IPV6_RECVERR:
|
||||
var errCmsg linux.SockErrCMsgIPv6
|
||||
@@ -603,7 +609,7 @@ func Parse(t *kernel.Task, socketOrEndpoint interface{}, buf []byte, width uint)
|
||||
|
||||
errCmsg.UnmarshalBytes(buf[i : i+errCmsg.SizeBytes()])
|
||||
cmsgs.IP.SockErr = &errCmsg
|
||||
i += binary.AlignUp(length, width)
|
||||
i += bits.AlignUp(length, width)
|
||||
|
||||
default:
|
||||
return socket.ControlMessages{}, syserror.EINVAL
|
||||
|
||||
@@ -17,7 +17,6 @@ go_library(
|
||||
visibility = ["//pkg/sentry:internal"],
|
||||
deps = [
|
||||
"//pkg/abi/linux",
|
||||
"//pkg/binary",
|
||||
"//pkg/context",
|
||||
"//pkg/fdnotifier",
|
||||
"//pkg/hostarch",
|
||||
|
||||
@@ -19,7 +19,6 @@ import (
|
||||
|
||||
"golang.org/x/sys/unix"
|
||||
"gvisor.dev/gvisor/pkg/abi/linux"
|
||||
"gvisor.dev/gvisor/pkg/binary"
|
||||
"gvisor.dev/gvisor/pkg/context"
|
||||
"gvisor.dev/gvisor/pkg/fdnotifier"
|
||||
"gvisor.dev/gvisor/pkg/hostarch"
|
||||
@@ -529,7 +528,7 @@ func parseUnixControlMessages(unixControlMessages []unix.SocketControlMessage) s
|
||||
case linux.SO_TIMESTAMP:
|
||||
controlMessages.IP.HasTimestamp = true
|
||||
ts := linux.Timeval{}
|
||||
ts.UnmarshalBytes(unixCmsg.Data[:linux.SizeOfTimeval])
|
||||
ts.UnmarshalUnsafe(unixCmsg.Data[:linux.SizeOfTimeval])
|
||||
controlMessages.IP.Timestamp = ts.ToNsecCapped()
|
||||
}
|
||||
|
||||
@@ -537,17 +536,19 @@ func parseUnixControlMessages(unixControlMessages []unix.SocketControlMessage) s
|
||||
switch unixCmsg.Header.Type {
|
||||
case linux.IP_TOS:
|
||||
controlMessages.IP.HasTOS = true
|
||||
binary.Unmarshal(unixCmsg.Data[:linux.SizeOfControlMessageTOS], hostarch.ByteOrder, &controlMessages.IP.TOS)
|
||||
var tos primitive.Uint8
|
||||
tos.UnmarshalUnsafe(unixCmsg.Data[:tos.SizeBytes()])
|
||||
controlMessages.IP.TOS = uint8(tos)
|
||||
|
||||
case linux.IP_PKTINFO:
|
||||
controlMessages.IP.HasIPPacketInfo = true
|
||||
var packetInfo linux.ControlMessageIPPacketInfo
|
||||
binary.Unmarshal(unixCmsg.Data[:linux.SizeOfControlMessageIPPacketInfo], hostarch.ByteOrder, &packetInfo)
|
||||
packetInfo.UnmarshalUnsafe(unixCmsg.Data[:packetInfo.SizeBytes()])
|
||||
controlMessages.IP.PacketInfo = packetInfo
|
||||
|
||||
case linux.IP_RECVORIGDSTADDR:
|
||||
var addr linux.SockAddrInet
|
||||
binary.Unmarshal(unixCmsg.Data[:addr.SizeBytes()], hostarch.ByteOrder, &addr)
|
||||
addr.UnmarshalUnsafe(unixCmsg.Data[:addr.SizeBytes()])
|
||||
controlMessages.IP.OriginalDstAddress = &addr
|
||||
|
||||
case unix.IP_RECVERR:
|
||||
@@ -560,11 +561,13 @@ func parseUnixControlMessages(unixControlMessages []unix.SocketControlMessage) s
|
||||
switch unixCmsg.Header.Type {
|
||||
case linux.IPV6_TCLASS:
|
||||
controlMessages.IP.HasTClass = true
|
||||
binary.Unmarshal(unixCmsg.Data[:linux.SizeOfControlMessageTClass], hostarch.ByteOrder, &controlMessages.IP.TClass)
|
||||
var tclass primitive.Uint32
|
||||
tclass.UnmarshalUnsafe(unixCmsg.Data[:tclass.SizeBytes()])
|
||||
controlMessages.IP.TClass = uint32(tclass)
|
||||
|
||||
case linux.IPV6_RECVORIGDSTADDR:
|
||||
var addr linux.SockAddrInet6
|
||||
binary.Unmarshal(unixCmsg.Data[:addr.SizeBytes()], hostarch.ByteOrder, &addr)
|
||||
addr.UnmarshalUnsafe(unixCmsg.Data[:addr.SizeBytes()])
|
||||
controlMessages.IP.OriginalDstAddress = &addr
|
||||
|
||||
case unix.IPV6_RECVERR:
|
||||
@@ -577,7 +580,9 @@ func parseUnixControlMessages(unixControlMessages []unix.SocketControlMessage) s
|
||||
switch unixCmsg.Header.Type {
|
||||
case linux.TCP_INQ:
|
||||
controlMessages.IP.HasInq = true
|
||||
binary.Unmarshal(unixCmsg.Data[:linux.SizeOfControlMessageInq], hostarch.ByteOrder, &controlMessages.IP.Inq)
|
||||
var inq primitive.Int32
|
||||
inq.UnmarshalUnsafe(unixCmsg.Data[:linux.SizeOfControlMessageInq])
|
||||
controlMessages.IP.Inq = int32(inq)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -691,7 +696,7 @@ func (s *socketOpsCommon) State() uint32 {
|
||||
return 0
|
||||
}
|
||||
|
||||
binary.Unmarshal(buf, hostarch.ByteOrder, &info)
|
||||
info.UnmarshalUnsafe(buf[:info.SizeBytes()])
|
||||
return uint32(info.State)
|
||||
}
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
package hostinet
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
@@ -26,10 +27,10 @@ import (
|
||||
"syscall"
|
||||
|
||||
"golang.org/x/sys/unix"
|
||||
"gvisor.dev/gvisor/pkg/binary"
|
||||
"gvisor.dev/gvisor/pkg/abi/linux"
|
||||
"gvisor.dev/gvisor/pkg/context"
|
||||
"gvisor.dev/gvisor/pkg/hostarch"
|
||||
"gvisor.dev/gvisor/pkg/log"
|
||||
"gvisor.dev/gvisor/pkg/marshal/primitive"
|
||||
"gvisor.dev/gvisor/pkg/sentry/inet"
|
||||
"gvisor.dev/gvisor/pkg/syserr"
|
||||
"gvisor.dev/gvisor/pkg/syserror"
|
||||
@@ -147,8 +148,8 @@ func ExtractHostInterfaces(links []syscall.NetlinkMessage, addrs []syscall.Netli
|
||||
if len(link.Data) < unix.SizeofIfInfomsg {
|
||||
return fmt.Errorf("RTM_GETLINK returned RTM_NEWLINK message with invalid data length (%d bytes, expected at least %d bytes)", len(link.Data), unix.SizeofIfInfomsg)
|
||||
}
|
||||
var ifinfo unix.IfInfomsg
|
||||
binary.Unmarshal(link.Data[:unix.SizeofIfInfomsg], hostarch.ByteOrder, &ifinfo)
|
||||
var ifinfo linux.InterfaceInfoMessage
|
||||
ifinfo.UnmarshalUnsafe(link.Data[:ifinfo.SizeBytes()])
|
||||
inetIF := inet.Interface{
|
||||
DeviceType: ifinfo.Type,
|
||||
Flags: ifinfo.Flags,
|
||||
@@ -178,11 +179,11 @@ func ExtractHostInterfaces(links []syscall.NetlinkMessage, addrs []syscall.Netli
|
||||
if len(addr.Data) < unix.SizeofIfAddrmsg {
|
||||
return fmt.Errorf("RTM_GETADDR returned RTM_NEWADDR message with invalid data length (%d bytes, expected at least %d bytes)", len(addr.Data), unix.SizeofIfAddrmsg)
|
||||
}
|
||||
var ifaddr unix.IfAddrmsg
|
||||
binary.Unmarshal(addr.Data[:unix.SizeofIfAddrmsg], hostarch.ByteOrder, &ifaddr)
|
||||
var ifaddr linux.InterfaceAddrMessage
|
||||
ifaddr.UnmarshalUnsafe(addr.Data[:ifaddr.SizeBytes()])
|
||||
inetAddr := inet.InterfaceAddr{
|
||||
Family: ifaddr.Family,
|
||||
PrefixLen: ifaddr.Prefixlen,
|
||||
PrefixLen: ifaddr.PrefixLen,
|
||||
Flags: ifaddr.Flags,
|
||||
}
|
||||
attrs, err := syscall.ParseNetlinkRouteAttr(&addr)
|
||||
@@ -210,13 +211,13 @@ func ExtractHostRoutes(routeMsgs []syscall.NetlinkMessage) ([]inet.Route, error)
|
||||
continue
|
||||
}
|
||||
|
||||
var ifRoute unix.RtMsg
|
||||
binary.Unmarshal(routeMsg.Data[:unix.SizeofRtMsg], hostarch.ByteOrder, &ifRoute)
|
||||
var ifRoute linux.RouteMessage
|
||||
ifRoute.UnmarshalUnsafe(routeMsg.Data[:ifRoute.SizeBytes()])
|
||||
inetRoute := inet.Route{
|
||||
Family: ifRoute.Family,
|
||||
DstLen: ifRoute.Dst_len,
|
||||
SrcLen: ifRoute.Src_len,
|
||||
TOS: ifRoute.Tos,
|
||||
DstLen: ifRoute.DstLen,
|
||||
SrcLen: ifRoute.SrcLen,
|
||||
TOS: ifRoute.TOS,
|
||||
Table: ifRoute.Table,
|
||||
Protocol: ifRoute.Protocol,
|
||||
Scope: ifRoute.Scope,
|
||||
@@ -245,7 +246,9 @@ func ExtractHostRoutes(routeMsgs []syscall.NetlinkMessage) ([]inet.Route, error)
|
||||
if len(attr.Value) != expected {
|
||||
return nil, fmt.Errorf("RTM_GETROUTE returned RTM_NEWROUTE message with invalid attribute data length (%d bytes, expected %d bytes)", len(attr.Value), expected)
|
||||
}
|
||||
binary.Unmarshal(attr.Value, hostarch.ByteOrder, &inetRoute.OutputInterface)
|
||||
var outputIF primitive.Int32
|
||||
outputIF.UnmarshalUnsafe(attr.Value)
|
||||
inetRoute.OutputInterface = int32(outputIF)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -14,14 +14,16 @@ go_library(
|
||||
"tcp_matcher.go",
|
||||
"udp_matcher.go",
|
||||
],
|
||||
marshal = True,
|
||||
# This target depends on netstack and should only be used by epsocket,
|
||||
# which is allowed to depend on netstack.
|
||||
visibility = ["//pkg/sentry:internal"],
|
||||
deps = [
|
||||
"//pkg/abi/linux",
|
||||
"//pkg/binary",
|
||||
"//pkg/bits",
|
||||
"//pkg/hostarch",
|
||||
"//pkg/log",
|
||||
"//pkg/marshal",
|
||||
"//pkg/sentry/kernel",
|
||||
"//pkg/syserr",
|
||||
"//pkg/tcpip",
|
||||
|
||||
@@ -18,8 +18,7 @@ import (
|
||||
"fmt"
|
||||
|
||||
"gvisor.dev/gvisor/pkg/abi/linux"
|
||||
"gvisor.dev/gvisor/pkg/binary"
|
||||
"gvisor.dev/gvisor/pkg/hostarch"
|
||||
"gvisor.dev/gvisor/pkg/bits"
|
||||
"gvisor.dev/gvisor/pkg/syserr"
|
||||
"gvisor.dev/gvisor/pkg/tcpip"
|
||||
"gvisor.dev/gvisor/pkg/tcpip/stack"
|
||||
@@ -79,7 +78,7 @@ func marshalEntryMatch(name string, data []byte) []byte {
|
||||
nflog("marshaling matcher %q", name)
|
||||
|
||||
// We have to pad this struct size to a multiple of 8 bytes.
|
||||
size := binary.AlignUp(linux.SizeOfXTEntryMatch+len(data), 8)
|
||||
size := bits.AlignUp(linux.SizeOfXTEntryMatch+len(data), 8)
|
||||
matcher := linux.KernelXTEntryMatch{
|
||||
XTEntryMatch: linux.XTEntryMatch{
|
||||
MatchSize: uint16(size),
|
||||
@@ -88,9 +87,11 @@ func marshalEntryMatch(name string, data []byte) []byte {
|
||||
}
|
||||
copy(matcher.Name[:], name)
|
||||
|
||||
buf := make([]byte, 0, size)
|
||||
buf = binary.Marshal(buf, hostarch.ByteOrder, matcher)
|
||||
return append(buf, make([]byte, size-len(buf))...)
|
||||
buf := make([]byte, size)
|
||||
entryLen := matcher.XTEntryMatch.SizeBytes()
|
||||
matcher.XTEntryMatch.MarshalUnsafe(buf[:entryLen])
|
||||
copy(buf[entryLen:], matcher.Data)
|
||||
return buf
|
||||
}
|
||||
|
||||
func unmarshalMatcher(match linux.XTEntryMatch, filter stack.IPHeaderFilter, buf []byte) (stack.Matcher, error) {
|
||||
|
||||
@@ -18,8 +18,6 @@ import (
|
||||
"fmt"
|
||||
|
||||
"gvisor.dev/gvisor/pkg/abi/linux"
|
||||
"gvisor.dev/gvisor/pkg/binary"
|
||||
"gvisor.dev/gvisor/pkg/hostarch"
|
||||
"gvisor.dev/gvisor/pkg/syserr"
|
||||
"gvisor.dev/gvisor/pkg/tcpip"
|
||||
"gvisor.dev/gvisor/pkg/tcpip/header"
|
||||
@@ -141,10 +139,9 @@ func modifyEntries4(stk *stack.Stack, optVal []byte, replace *linux.IPTReplace,
|
||||
return nil, syserr.ErrInvalidArgument
|
||||
}
|
||||
var entry linux.IPTEntry
|
||||
buf := optVal[:linux.SizeOfIPTEntry]
|
||||
binary.Unmarshal(buf, hostarch.ByteOrder, &entry)
|
||||
entry.UnmarshalUnsafe(optVal[:entry.SizeBytes()])
|
||||
initialOptValLen := len(optVal)
|
||||
optVal = optVal[linux.SizeOfIPTEntry:]
|
||||
optVal = optVal[entry.SizeBytes():]
|
||||
|
||||
if entry.TargetOffset < linux.SizeOfIPTEntry {
|
||||
nflog("entry has too-small target offset %d", entry.TargetOffset)
|
||||
|
||||
@@ -18,8 +18,6 @@ import (
|
||||
"fmt"
|
||||
|
||||
"gvisor.dev/gvisor/pkg/abi/linux"
|
||||
"gvisor.dev/gvisor/pkg/binary"
|
||||
"gvisor.dev/gvisor/pkg/hostarch"
|
||||
"gvisor.dev/gvisor/pkg/syserr"
|
||||
"gvisor.dev/gvisor/pkg/tcpip"
|
||||
"gvisor.dev/gvisor/pkg/tcpip/header"
|
||||
@@ -144,10 +142,9 @@ func modifyEntries6(stk *stack.Stack, optVal []byte, replace *linux.IPTReplace,
|
||||
return nil, syserr.ErrInvalidArgument
|
||||
}
|
||||
var entry linux.IP6TEntry
|
||||
buf := optVal[:linux.SizeOfIP6TEntry]
|
||||
binary.Unmarshal(buf, hostarch.ByteOrder, &entry)
|
||||
entry.UnmarshalUnsafe(optVal[:entry.SizeBytes()])
|
||||
initialOptValLen := len(optVal)
|
||||
optVal = optVal[linux.SizeOfIP6TEntry:]
|
||||
optVal = optVal[entry.SizeBytes():]
|
||||
|
||||
if entry.TargetOffset < linux.SizeOfIP6TEntry {
|
||||
nflog("entry has too-small target offset %d", entry.TargetOffset)
|
||||
|
||||
@@ -22,7 +22,6 @@ import (
|
||||
"fmt"
|
||||
|
||||
"gvisor.dev/gvisor/pkg/abi/linux"
|
||||
"gvisor.dev/gvisor/pkg/binary"
|
||||
"gvisor.dev/gvisor/pkg/hostarch"
|
||||
"gvisor.dev/gvisor/pkg/log"
|
||||
"gvisor.dev/gvisor/pkg/sentry/kernel"
|
||||
@@ -121,7 +120,7 @@ func GetEntries4(t *kernel.Task, stack *stack.Stack, outPtr hostarch.Addr, outLe
|
||||
nflog("couldn't read entries: %v", err)
|
||||
return linux.KernelIPTGetEntries{}, syserr.ErrInvalidArgument
|
||||
}
|
||||
if binary.Size(entries) > uintptr(outLen) {
|
||||
if entries.SizeBytes() > outLen {
|
||||
nflog("insufficient GetEntries output size: %d", uintptr(outLen))
|
||||
return linux.KernelIPTGetEntries{}, syserr.ErrInvalidArgument
|
||||
}
|
||||
@@ -146,7 +145,7 @@ func GetEntries6(t *kernel.Task, stack *stack.Stack, outPtr hostarch.Addr, outLe
|
||||
nflog("couldn't read entries: %v", err)
|
||||
return linux.KernelIP6TGetEntries{}, syserr.ErrInvalidArgument
|
||||
}
|
||||
if binary.Size(entries) > uintptr(outLen) {
|
||||
if entries.SizeBytes() > outLen {
|
||||
nflog("insufficient GetEntries output size: %d", uintptr(outLen))
|
||||
return linux.KernelIP6TGetEntries{}, syserr.ErrInvalidArgument
|
||||
}
|
||||
@@ -179,7 +178,7 @@ func SetEntries(stk *stack.Stack, optVal []byte, ipv6 bool) *syserr.Error {
|
||||
var replace linux.IPTReplace
|
||||
replaceBuf := optVal[:linux.SizeOfIPTReplace]
|
||||
optVal = optVal[linux.SizeOfIPTReplace:]
|
||||
binary.Unmarshal(replaceBuf, hostarch.ByteOrder, &replace)
|
||||
replace.UnmarshalBytes(replaceBuf)
|
||||
|
||||
// TODO(gvisor.dev/issue/170): Support other tables.
|
||||
var table stack.Table
|
||||
@@ -309,8 +308,8 @@ func parseMatchers(filter stack.IPHeaderFilter, optVal []byte) ([]stack.Matcher,
|
||||
return nil, fmt.Errorf("optVal has insufficient size for entry match: %d", len(optVal))
|
||||
}
|
||||
var match linux.XTEntryMatch
|
||||
buf := optVal[:linux.SizeOfXTEntryMatch]
|
||||
binary.Unmarshal(buf, hostarch.ByteOrder, &match)
|
||||
buf := optVal[:match.SizeBytes()]
|
||||
match.UnmarshalUnsafe(buf)
|
||||
nflog("set entries: parsed entry match %q: %+v", match.Name.String(), match)
|
||||
|
||||
// Check some invariants.
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user