mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Move Align{Up,Down} into binary package.
PiperOrigin-RevId: 294477647
This commit is contained in:
@@ -254,3 +254,13 @@ func WriteUint64(w io.Writer, order binary.ByteOrder, num uint64) error {
|
||||
_, err := w.Write(buf)
|
||||
return err
|
||||
}
|
||||
|
||||
// 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)
|
||||
}
|
||||
|
||||
@@ -189,7 +189,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 := AlignDown(cap(buf)-len(buf), 4)
|
||||
space := binary.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.
|
||||
@@ -282,19 +282,9 @@ func PackCredentials(t *kernel.Task, creds SCMCredentials, buf []byte, flags int
|
||||
return putCmsg(buf, flags, linux.SCM_CREDENTIALS, align, c)
|
||||
}
|
||||
|
||||
// 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 down to an alignment. align must be a power of 2.
|
||||
func AlignDown(length int, align uint) int {
|
||||
return length & ^(int(align) - 1)
|
||||
}
|
||||
|
||||
// alignSlice extends a slice's length (up to the capacity) to align it.
|
||||
func alignSlice(buf []byte, align uint) []byte {
|
||||
aligned := AlignUp(len(buf), align)
|
||||
aligned := binary.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
|
||||
@@ -377,7 +367,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 + AlignUp(dataLen, t.Arch().Width())
|
||||
return linux.SizeOfControlMessageHeader + binary.AlignUp(dataLen, t.Arch().Width())
|
||||
}
|
||||
|
||||
// CmsgsSpace returns the number of bytes needed to fit the control messages
|
||||
@@ -437,7 +427,7 @@ func Parse(t *kernel.Task, socketOrEndpoint interface{}, buf []byte) (socket.Con
|
||||
case linux.SOL_SOCKET:
|
||||
switch h.Type {
|
||||
case linux.SCM_RIGHTS:
|
||||
rightsSize := AlignDown(length, linux.SizeOfControlMessageRight)
|
||||
rightsSize := binary.AlignDown(length, linux.SizeOfControlMessageRight)
|
||||
numRights := rightsSize / linux.SizeOfControlMessageRight
|
||||
|
||||
if len(fds)+numRights > linux.SCM_MAX_FD {
|
||||
@@ -448,7 +438,7 @@ func Parse(t *kernel.Task, socketOrEndpoint interface{}, buf []byte) (socket.Con
|
||||
fds = append(fds, int32(usermem.ByteOrder.Uint32(buf[j:j+linux.SizeOfControlMessageRight])))
|
||||
}
|
||||
|
||||
i += AlignUp(length, width)
|
||||
i += binary.AlignUp(length, width)
|
||||
|
||||
case linux.SCM_CREDENTIALS:
|
||||
if length < linux.SizeOfControlMessageCredentials {
|
||||
@@ -462,7 +452,7 @@ func Parse(t *kernel.Task, socketOrEndpoint interface{}, buf []byte) (socket.Con
|
||||
return socket.ControlMessages{}, err
|
||||
}
|
||||
cmsgs.Unix.Credentials = scmCreds
|
||||
i += AlignUp(length, width)
|
||||
i += binary.AlignUp(length, width)
|
||||
|
||||
default:
|
||||
// Unknown message type.
|
||||
@@ -476,7 +466,7 @@ func Parse(t *kernel.Task, socketOrEndpoint interface{}, buf []byte) (socket.Con
|
||||
}
|
||||
cmsgs.IP.HasTOS = true
|
||||
binary.Unmarshal(buf[i:i+linux.SizeOfControlMessageTOS], usermem.ByteOrder, &cmsgs.IP.TOS)
|
||||
i += AlignUp(length, width)
|
||||
i += binary.AlignUp(length, width)
|
||||
|
||||
default:
|
||||
return socket.ControlMessages{}, syserror.EINVAL
|
||||
@@ -489,7 +479,7 @@ func Parse(t *kernel.Task, socketOrEndpoint interface{}, buf []byte) (socket.Con
|
||||
}
|
||||
cmsgs.IP.HasTClass = true
|
||||
binary.Unmarshal(buf[i:i+linux.SizeOfControlMessageTClass], usermem.ByteOrder, &cmsgs.IP.TClass)
|
||||
i += AlignUp(length, width)
|
||||
i += binary.AlignUp(length, width)
|
||||
|
||||
default:
|
||||
return socket.ControlMessages{}, syserror.EINVAL
|
||||
|
||||
@@ -72,7 +72,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 := alignUp(linux.SizeOfXTEntryMatch+len(data), 8)
|
||||
size := binary.AlignUp(linux.SizeOfXTEntryMatch+len(data), 8)
|
||||
matcher := linux.KernelXTEntryMatch{
|
||||
XTEntryMatch: linux.XTEntryMatch{
|
||||
MatchSize: uint16(size),
|
||||
@@ -93,8 +93,3 @@ func unmarshalMatcher(match linux.XTEntryMatch, filter iptables.IPHeaderFilter,
|
||||
}
|
||||
return matchMaker.unmarshal(buf, filter)
|
||||
}
|
||||
|
||||
// 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)
|
||||
}
|
||||
|
||||
@@ -23,18 +23,11 @@ import (
|
||||
"gvisor.dev/gvisor/pkg/usermem"
|
||||
)
|
||||
|
||||
// alignUp rounds a length up to an alignment.
|
||||
//
|
||||
// Preconditions: align is a power of two.
|
||||
func alignUp(length int, align uint) int {
|
||||
return (length + int(align) - 1) &^ (int(align) - 1)
|
||||
}
|
||||
|
||||
// alignPad returns the length of padding required for alignment.
|
||||
//
|
||||
// Preconditions: align is a power of two.
|
||||
func alignPad(length int, align uint) int {
|
||||
return alignUp(length, align) - length
|
||||
return binary.AlignUp(length, align) - length
|
||||
}
|
||||
|
||||
// Message contains a complete serialized netlink message.
|
||||
@@ -138,7 +131,7 @@ func (m *Message) Finalize() []byte {
|
||||
// Align the message. Note that the message length in the header (set
|
||||
// above) is the useful length of the message, not the total aligned
|
||||
// length. See net/netlink/af_netlink.c:__nlmsg_put.
|
||||
aligned := alignUp(len(m.buf), linux.NLMSG_ALIGNTO)
|
||||
aligned := binary.AlignUp(len(m.buf), linux.NLMSG_ALIGNTO)
|
||||
m.putZeros(aligned - len(m.buf))
|
||||
return m.buf
|
||||
}
|
||||
@@ -173,7 +166,7 @@ func (m *Message) PutAttr(atype uint16, v interface{}) {
|
||||
m.Put(v)
|
||||
|
||||
// Align the attribute.
|
||||
aligned := alignUp(l, linux.NLA_ALIGNTO)
|
||||
aligned := binary.AlignUp(l, linux.NLA_ALIGNTO)
|
||||
m.putZeros(aligned - l)
|
||||
}
|
||||
|
||||
@@ -190,7 +183,7 @@ func (m *Message) PutAttrString(atype uint16, s string) {
|
||||
m.putZeros(1)
|
||||
|
||||
// Align the attribute.
|
||||
aligned := alignUp(l, linux.NLA_ALIGNTO)
|
||||
aligned := binary.AlignUp(l, linux.NLA_ALIGNTO)
|
||||
m.putZeros(aligned - l)
|
||||
}
|
||||
|
||||
|
||||
@@ -30,7 +30,6 @@ go_library(
|
||||
"//pkg/seccomp",
|
||||
"//pkg/sentry/arch",
|
||||
"//pkg/sentry/kernel",
|
||||
"//pkg/sentry/socket/control",
|
||||
"//pkg/sentry/socket/netlink",
|
||||
"//pkg/sentry/socket/netstack",
|
||||
"//pkg/sentry/syscalls/linux",
|
||||
|
||||
@@ -22,7 +22,6 @@ import (
|
||||
"gvisor.dev/gvisor/pkg/abi/linux"
|
||||
"gvisor.dev/gvisor/pkg/binary"
|
||||
"gvisor.dev/gvisor/pkg/sentry/kernel"
|
||||
"gvisor.dev/gvisor/pkg/sentry/socket/control"
|
||||
"gvisor.dev/gvisor/pkg/sentry/socket/netlink"
|
||||
"gvisor.dev/gvisor/pkg/sentry/socket/netstack"
|
||||
slinux "gvisor.dev/gvisor/pkg/sentry/syscalls/linux"
|
||||
@@ -220,13 +219,13 @@ func cmsghdr(t *kernel.Task, addr usermem.Addr, length uint64, maxBytes uint64)
|
||||
|
||||
if skipData {
|
||||
strs = append(strs, fmt.Sprintf("{level=%s, type=%s, length=%d}", level, typ, h.Length))
|
||||
i += control.AlignUp(length, width)
|
||||
i += binary.AlignUp(length, width)
|
||||
continue
|
||||
}
|
||||
|
||||
switch h.Type {
|
||||
case linux.SCM_RIGHTS:
|
||||
rightsSize := control.AlignDown(length, linux.SizeOfControlMessageRight)
|
||||
rightsSize := binary.AlignDown(length, linux.SizeOfControlMessageRight)
|
||||
|
||||
numRights := rightsSize / linux.SizeOfControlMessageRight
|
||||
fds := make(linux.ControlMessageRights, numRights)
|
||||
@@ -295,7 +294,7 @@ func cmsghdr(t *kernel.Task, addr usermem.Addr, length uint64, maxBytes uint64)
|
||||
default:
|
||||
panic("unreachable")
|
||||
}
|
||||
i += control.AlignUp(length, width)
|
||||
i += binary.AlignUp(length, width)
|
||||
}
|
||||
|
||||
return fmt.Sprintf("%#x %s", addr, strings.Join(strs, ", "))
|
||||
|
||||
Reference in New Issue
Block a user