diff options
-rw-r--r-- | pkg/abi/linux/linux_abi_autogen_unsafe.go | 165 | ||||
-rw-r--r-- | pkg/abi/linux/netfilter.go | 73 | ||||
-rw-r--r-- | pkg/abi/linux/netfilter_ipv6.go | 67 |
3 files changed, 175 insertions, 130 deletions
diff --git a/pkg/abi/linux/linux_abi_autogen_unsafe.go b/pkg/abi/linux/linux_abi_autogen_unsafe.go index 5d10630f9..ddd1458a9 100644 --- a/pkg/abi/linux/linux_abi_autogen_unsafe.go +++ b/pkg/abi/linux/linux_abi_autogen_unsafe.go @@ -60,6 +60,9 @@ var _ marshal.Marshallable = (*Inet6Addr)(nil) var _ marshal.Marshallable = (*InetAddr)(nil) var _ marshal.Marshallable = (*ItimerVal)(nil) var _ marshal.Marshallable = (*Itimerspec)(nil) +var _ marshal.Marshallable = (*KernelIP6TGetEntries)(nil) +var _ marshal.Marshallable = (*KernelIPTEntry)(nil) +var _ marshal.Marshallable = (*KernelIPTGetEntries)(nil) var _ marshal.Marshallable = (*Linger)(nil) var _ marshal.Marshallable = (*NumaPolicy)(nil) var _ marshal.Marshallable = (*PollFD)(nil) @@ -5566,6 +5569,114 @@ func (i *IPTIP) WriteTo(writer io.Writer) (int64, error) { return int64(length), err } +// Packed implements marshal.Marshallable.Packed. +//go:nosplit +func (ke *KernelIPTEntry) Packed() bool { + return false +} + +// MarshalUnsafe implements marshal.Marshallable.MarshalUnsafe. +func (ke *KernelIPTEntry) MarshalUnsafe(dst []byte) { + // Type KernelIPTEntry doesn't have a packed layout in memory, fallback to MarshalBytes. + ke.MarshalBytes(dst) +} + +// UnmarshalUnsafe implements marshal.Marshallable.UnmarshalUnsafe. +func (ke *KernelIPTEntry) UnmarshalUnsafe(src []byte) { + // Type KernelIPTEntry doesn't have a packed layout in memory, fallback to UnmarshalBytes. + ke.UnmarshalBytes(src) +} + +// CopyOutN implements marshal.Marshallable.CopyOutN. +//go:nosplit +func (ke *KernelIPTEntry) CopyOutN(cc marshal.CopyContext, addr usermem.Addr, limit int) (int, error) { + // Type KernelIPTEntry doesn't have a packed layout in memory, fall back to MarshalBytes. + buf := cc.CopyScratchBuffer(ke.SizeBytes()) // escapes: okay. + ke.MarshalBytes(buf) // escapes: fallback. + return cc.CopyOutBytes(addr, buf[:limit]) // escapes: okay. +} + +// CopyOut implements marshal.Marshallable.CopyOut. +//go:nosplit +func (ke *KernelIPTEntry) CopyOut(cc marshal.CopyContext, addr usermem.Addr) (int, error) { + return ke.CopyOutN(cc, addr, ke.SizeBytes()) +} + +// CopyIn implements marshal.Marshallable.CopyIn. +//go:nosplit +func (ke *KernelIPTEntry) CopyIn(cc marshal.CopyContext, addr usermem.Addr) (int, error) { + // Type KernelIPTEntry doesn't have a packed layout in memory, fall back to UnmarshalBytes. + buf := cc.CopyScratchBuffer(ke.SizeBytes()) // escapes: okay. + length, err := cc.CopyInBytes(addr, buf) // escapes: okay. + // Unmarshal unconditionally. If we had a short copy-in, this results in a + // partially unmarshalled struct. + ke.UnmarshalBytes(buf) // escapes: fallback. + return length, err +} + +// WriteTo implements io.WriterTo.WriteTo. +func (ke *KernelIPTEntry) WriteTo(writer io.Writer) (int64, error) { + // Type KernelIPTEntry doesn't have a packed layout in memory, fall back to MarshalBytes. + buf := make([]byte, ke.SizeBytes()) + ke.MarshalBytes(buf) + length, err := writer.Write(buf) + return int64(length), err +} + +// Packed implements marshal.Marshallable.Packed. +//go:nosplit +func (ke *KernelIPTGetEntries) Packed() bool { + return false +} + +// MarshalUnsafe implements marshal.Marshallable.MarshalUnsafe. +func (ke *KernelIPTGetEntries) MarshalUnsafe(dst []byte) { + // Type KernelIPTGetEntries doesn't have a packed layout in memory, fallback to MarshalBytes. + ke.MarshalBytes(dst) +} + +// UnmarshalUnsafe implements marshal.Marshallable.UnmarshalUnsafe. +func (ke *KernelIPTGetEntries) UnmarshalUnsafe(src []byte) { + // Type KernelIPTGetEntries doesn't have a packed layout in memory, fallback to UnmarshalBytes. + ke.UnmarshalBytes(src) +} + +// CopyOutN implements marshal.Marshallable.CopyOutN. +//go:nosplit +func (ke *KernelIPTGetEntries) CopyOutN(cc marshal.CopyContext, addr usermem.Addr, limit int) (int, error) { + // Type KernelIPTGetEntries doesn't have a packed layout in memory, fall back to MarshalBytes. + buf := cc.CopyScratchBuffer(ke.SizeBytes()) // escapes: okay. + ke.MarshalBytes(buf) // escapes: fallback. + return cc.CopyOutBytes(addr, buf[:limit]) // escapes: okay. +} + +// CopyOut implements marshal.Marshallable.CopyOut. +//go:nosplit +func (ke *KernelIPTGetEntries) CopyOut(cc marshal.CopyContext, addr usermem.Addr) (int, error) { + return ke.CopyOutN(cc, addr, ke.SizeBytes()) +} + +// CopyIn implements marshal.Marshallable.CopyIn. +//go:nosplit +func (ke *KernelIPTGetEntries) CopyIn(cc marshal.CopyContext, addr usermem.Addr) (int, error) { + // Type KernelIPTGetEntries doesn't have a packed layout in memory, fall back to UnmarshalBytes. + buf := cc.CopyScratchBuffer(ke.SizeBytes()) // escapes: okay. + length, err := cc.CopyInBytes(addr, buf) // escapes: okay. + // Unmarshal unconditionally. If we had a short copy-in, this results in a + // partially unmarshalled struct. + ke.UnmarshalBytes(buf) // escapes: fallback. + return length, err +} + +// WriteTo implements io.WriterTo.WriteTo. +func (ke *KernelIPTGetEntries) WriteTo(writer io.Writer) (int64, error) { + // Type KernelIPTGetEntries doesn't have a packed layout in memory, fall back to MarshalBytes. + buf := make([]byte, ke.SizeBytes()) + ke.MarshalBytes(buf) + length, err := writer.Write(buf) + return int64(length), err +} + // SizeBytes implements marshal.Marshallable.SizeBytes. //go:nosplit func (tn *TableName) SizeBytes() int { @@ -6394,6 +6505,60 @@ func (i *IP6TReplace) WriteTo(writer io.Writer) (int64, error) { return int64(length), err } +// Packed implements marshal.Marshallable.Packed. +//go:nosplit +func (ke *KernelIP6TGetEntries) Packed() bool { + return false +} + +// MarshalUnsafe implements marshal.Marshallable.MarshalUnsafe. +func (ke *KernelIP6TGetEntries) MarshalUnsafe(dst []byte) { + // Type KernelIP6TGetEntries doesn't have a packed layout in memory, fallback to MarshalBytes. + ke.MarshalBytes(dst) +} + +// UnmarshalUnsafe implements marshal.Marshallable.UnmarshalUnsafe. +func (ke *KernelIP6TGetEntries) UnmarshalUnsafe(src []byte) { + // Type KernelIP6TGetEntries doesn't have a packed layout in memory, fallback to UnmarshalBytes. + ke.UnmarshalBytes(src) +} + +// CopyOutN implements marshal.Marshallable.CopyOutN. +//go:nosplit +func (ke *KernelIP6TGetEntries) CopyOutN(cc marshal.CopyContext, addr usermem.Addr, limit int) (int, error) { + // Type KernelIP6TGetEntries doesn't have a packed layout in memory, fall back to MarshalBytes. + buf := cc.CopyScratchBuffer(ke.SizeBytes()) // escapes: okay. + ke.MarshalBytes(buf) // escapes: fallback. + return cc.CopyOutBytes(addr, buf[:limit]) // escapes: okay. +} + +// CopyOut implements marshal.Marshallable.CopyOut. +//go:nosplit +func (ke *KernelIP6TGetEntries) CopyOut(cc marshal.CopyContext, addr usermem.Addr) (int, error) { + return ke.CopyOutN(cc, addr, ke.SizeBytes()) +} + +// CopyIn implements marshal.Marshallable.CopyIn. +//go:nosplit +func (ke *KernelIP6TGetEntries) CopyIn(cc marshal.CopyContext, addr usermem.Addr) (int, error) { + // Type KernelIP6TGetEntries doesn't have a packed layout in memory, fall back to UnmarshalBytes. + buf := cc.CopyScratchBuffer(ke.SizeBytes()) // escapes: okay. + length, err := cc.CopyInBytes(addr, buf) // escapes: okay. + // Unmarshal unconditionally. If we had a short copy-in, this results in a + // partially unmarshalled struct. + ke.UnmarshalBytes(buf) // escapes: fallback. + return length, err +} + +// WriteTo implements io.WriterTo.WriteTo. +func (ke *KernelIP6TGetEntries) WriteTo(writer io.Writer) (int64, error) { + // Type KernelIP6TGetEntries doesn't have a packed layout in memory, fall back to MarshalBytes. + buf := make([]byte, ke.SizeBytes()) + ke.MarshalBytes(buf) + length, err := writer.Write(buf) + return int64(length), err +} + // SizeBytes implements marshal.Marshallable.SizeBytes. func (s *SockAddrNetlink) SizeBytes() int { return 12 diff --git a/pkg/abi/linux/netfilter.go b/pkg/abi/linux/netfilter.go index b521144d9..378f1baf3 100644 --- a/pkg/abi/linux/netfilter.go +++ b/pkg/abi/linux/netfilter.go @@ -15,11 +15,8 @@ package linux import ( - "io" - "gvisor.dev/gvisor/pkg/marshal" "gvisor.dev/gvisor/pkg/marshal/primitive" - "gvisor.dev/gvisor/pkg/usermem" ) // This file contains structures required to support netfilter, specifically @@ -129,8 +126,8 @@ type IPTEntry struct { const SizeOfIPTEntry = 112 // KernelIPTEntry is identical to IPTEntry, but includes the Elems field. -// KernelIPTEntry itself is not Marshallable but it implements some methods of -// marshal.Marshallable that help in other implementations of Marshallable. +// +// +marshal dynamic type KernelIPTEntry struct { Entry IPTEntry @@ -158,6 +155,8 @@ func (ke *KernelIPTEntry) UnmarshalBytes(src []byte) { ke.Elems.UnmarshalBytes(src[ke.Entry.SizeBytes():]) } +var _ marshal.Marshallable = (*KernelIPTEntry)(nil) + // IPTIP contains information for matching a packet's IP header. // It corresponds to struct ipt_ip in // include/uapi/linux/netfilter_ipv4/ip_tables.h. @@ -411,8 +410,9 @@ type IPTGetEntries struct { const SizeOfIPTGetEntries = 40 // KernelIPTGetEntries is identical to IPTGetEntries, but includes the -// Entrytable field. This has been manually made marshal.Marshallable since it -// is dynamically sized. +// Entrytable field. +// +// +marshal dynamic type KernelIPTGetEntries struct { IPTGetEntries Entrytable []KernelIPTEntry @@ -447,65 +447,6 @@ func (ke *KernelIPTGetEntries) UnmarshalBytes(src []byte) { } } -// Packed implements marshal.Marshallable.Packed. -func (ke *KernelIPTGetEntries) Packed() bool { - // KernelIPTGetEntries isn't packed because the ke.Entrytable contains an - // indirection to the actual data we want to marshal (the slice data - // pointer), and the memory for KernelIPTGetEntries contains the slice - // header which we don't want to marshal. - return false -} - -// MarshalUnsafe implements marshal.Marshallable.MarshalUnsafe. -func (ke *KernelIPTGetEntries) MarshalUnsafe(dst []byte) { - // Fall back to safe Marshal because the type in not packed. - ke.MarshalBytes(dst) -} - -// UnmarshalUnsafe implements marshal.Marshallable.UnmarshalUnsafe. -func (ke *KernelIPTGetEntries) UnmarshalUnsafe(src []byte) { - // Fall back to safe Unmarshal because the type in not packed. - ke.UnmarshalBytes(src) -} - -// CopyIn implements marshal.Marshallable.CopyIn. -func (ke *KernelIPTGetEntries) CopyIn(cc marshal.CopyContext, addr usermem.Addr) (int, error) { - buf := cc.CopyScratchBuffer(ke.SizeBytes()) // escapes: okay. - length, err := cc.CopyInBytes(addr, buf) // escapes: okay. - // Unmarshal unconditionally. If we had a short copy-in, this results in a - // partially unmarshalled struct. - ke.UnmarshalBytes(buf) // escapes: fallback. - return length, err -} - -// CopyOut implements marshal.Marshallable.CopyOut. -func (ke *KernelIPTGetEntries) CopyOut(cc marshal.CopyContext, addr usermem.Addr) (int, error) { - // Type KernelIPTGetEntries doesn't have a packed layout in memory, fall - // back to MarshalBytes. - return cc.CopyOutBytes(addr, ke.marshalAll(cc)) -} - -// CopyOutN implements marshal.Marshallable.CopyOutN. -func (ke *KernelIPTGetEntries) CopyOutN(cc marshal.CopyContext, addr usermem.Addr, limit int) (int, error) { - // Type KernelIPTGetEntries doesn't have a packed layout in memory, fall - // back to MarshalBytes. - return cc.CopyOutBytes(addr, ke.marshalAll(cc)[:limit]) -} - -func (ke *KernelIPTGetEntries) marshalAll(cc marshal.CopyContext) []byte { - buf := cc.CopyScratchBuffer(ke.SizeBytes()) - ke.MarshalBytes(buf) - return buf -} - -// WriteTo implements io.WriterTo.WriteTo. -func (ke *KernelIPTGetEntries) WriteTo(w io.Writer) (int64, error) { - buf := make([]byte, ke.SizeBytes()) - ke.MarshalBytes(buf) - length, err := w.Write(buf) - return int64(length), err -} - var _ marshal.Marshallable = (*KernelIPTGetEntries)(nil) // IPTReplace is the argument for the IPT_SO_SET_REPLACE sockopt. It diff --git a/pkg/abi/linux/netfilter_ipv6.go b/pkg/abi/linux/netfilter_ipv6.go index bcb57642e..b953e62dc 100644 --- a/pkg/abi/linux/netfilter_ipv6.go +++ b/pkg/abi/linux/netfilter_ipv6.go @@ -15,11 +15,8 @@ package linux import ( - "io" - "gvisor.dev/gvisor/pkg/marshal" "gvisor.dev/gvisor/pkg/marshal/primitive" - "gvisor.dev/gvisor/pkg/usermem" ) // This file contains structures required to support IPv6 netfilter and @@ -70,8 +67,9 @@ type IP6TReplace struct { const SizeOfIP6TReplace = 96 // KernelIP6TGetEntries is identical to IP6TGetEntries, but includes the -// Entrytable field. This has been manually made marshal.Marshallable since it -// is dynamically sized. +// Entrytable field. +// +// +marshal dynamic type KernelIP6TGetEntries struct { IPTGetEntries Entrytable []KernelIP6TEntry @@ -106,65 +104,6 @@ func (ke *KernelIP6TGetEntries) UnmarshalBytes(src []byte) { } } -// Packed implements marshal.Marshallable.Packed. -func (ke *KernelIP6TGetEntries) Packed() bool { - // KernelIP6TGetEntries isn't packed because the ke.Entrytable contains - // an indirection to the actual data we want to marshal (the slice data - // pointer), and the memory for KernelIP6TGetEntries contains the slice - // header which we don't want to marshal. - return false -} - -// MarshalUnsafe implements marshal.Marshallable.MarshalUnsafe. -func (ke *KernelIP6TGetEntries) MarshalUnsafe(dst []byte) { - // Fall back to safe Marshal because the type in not packed. - ke.MarshalBytes(dst) -} - -// UnmarshalUnsafe implements marshal.Marshallable.UnmarshalUnsafe. -func (ke *KernelIP6TGetEntries) UnmarshalUnsafe(src []byte) { - // Fall back to safe Unmarshal because the type in not packed. - ke.UnmarshalBytes(src) -} - -// CopyIn implements marshal.Marshallable.CopyIn. -func (ke *KernelIP6TGetEntries) CopyIn(cc marshal.CopyContext, addr usermem.Addr) (int, error) { - buf := cc.CopyScratchBuffer(ke.SizeBytes()) // escapes: okay. - length, err := cc.CopyInBytes(addr, buf) // escapes: okay. - // Unmarshal unconditionally. If we had a short copy-in, this results - // in a partially unmarshalled struct. - ke.UnmarshalBytes(buf) // escapes: fallback. - return length, err -} - -// CopyOut implements marshal.Marshallable.CopyOut. -func (ke *KernelIP6TGetEntries) CopyOut(cc marshal.CopyContext, addr usermem.Addr) (int, error) { - // Type KernelIP6TGetEntries doesn't have a packed layout in memory, - // fall back to MarshalBytes. - return cc.CopyOutBytes(addr, ke.marshalAll(cc)) -} - -// CopyOutN implements marshal.Marshallable.CopyOutN. -func (ke *KernelIP6TGetEntries) CopyOutN(cc marshal.CopyContext, addr usermem.Addr, limit int) (int, error) { - // Type KernelIP6TGetEntries doesn't have a packed layout in memory, fall - // back to MarshalBytes. - return cc.CopyOutBytes(addr, ke.marshalAll(cc)[:limit]) -} - -func (ke *KernelIP6TGetEntries) marshalAll(cc marshal.CopyContext) []byte { - buf := cc.CopyScratchBuffer(ke.SizeBytes()) - ke.MarshalBytes(buf) - return buf -} - -// WriteTo implements io.WriterTo.WriteTo. -func (ke *KernelIP6TGetEntries) WriteTo(w io.Writer) (int64, error) { - buf := make([]byte, ke.SizeBytes()) - ke.MarshalBytes(buf) - length, err := w.Write(buf) - return int64(length), err -} - var _ marshal.Marshallable = (*KernelIP6TGetEntries)(nil) // IP6TEntry is an iptables rule. It corresponds to struct ip6t_entry in |