Fix strace logging for AF_UNIX sockets.

This was broken in commit 64268c8, which moved parsing of addresses for
AF_UNIX sockets to the socket/unix package.

While we're here, add strace support for AF_PACKET sockets, since
socket.AddressAndFamily can already decode their address.

PiperOrigin-RevId: 661391690
This commit is contained in:
Nicolas Lacasse
2024-08-09 13:54:10 -07:00
committed by gVisor bot
parent 01a3927adf
commit 876de08e59
4 changed files with 15 additions and 10 deletions
+2 -2
View File
@@ -516,8 +516,8 @@ func BytesToIPAddress(addr []byte) tcpip.Address {
}
// AddressAndFamily reads an sockaddr struct from the given address and
// converts it to the FullAddress format. It supports AF_UNIX, AF_INET,
// AF_INET6, and AF_PACKET addresses.
// converts it to the FullAddress format. It supports AF_INET, AF_INET6, and
// AF_PACKET addresses.
//
// AddressAndFamily returns an address and its family.
func AddressAndFamily(addr []byte) (tcpip.FullAddress, uint16, *syserr.Error) {
+4 -2
View File
@@ -445,7 +445,7 @@ func (s *Socket) Endpoint() transport.Endpoint {
// extractPath extracts and validates the address.
func extractPath(sockaddr []byte) (string, *syserr.Error) {
addr, family, err := addressAndFamily(sockaddr)
addr, family, err := AddressAndFamily(sockaddr)
if err != nil {
if err == syserr.ErrAddressFamilyNotSupported {
err = syserr.ErrInvalidArgument
@@ -466,7 +466,9 @@ func extractPath(sockaddr []byte) (string, *syserr.Error) {
return p, nil
}
func addressAndFamily(addr []byte) (transport.Address, uint16, *syserr.Error) {
// AddressAndFamily converts the addr byte slice to a transport.Address and
// family. It supports only AF_UNIX addresses.
func AddressAndFamily(addr []byte) (transport.Address, uint16, *syserr.Error) {
// Make sure we have at least 2 bytes for the address family.
if len(addr) < 2 {
return transport.Address{}, 0, syserr.ErrInvalidArgument
+1
View File
@@ -39,6 +39,7 @@ go_library(
"//pkg/sentry/kernel",
"//pkg/sentry/socket",
"//pkg/sentry/socket/netlink",
"//pkg/sentry/socket/unix",
"//pkg/sentry/syscalls/linux",
],
)
+8 -6
View File
@@ -26,6 +26,7 @@ import (
"gvisor.dev/gvisor/pkg/sentry/kernel"
"gvisor.dev/gvisor/pkg/sentry/socket"
"gvisor.dev/gvisor/pkg/sentry/socket/netlink"
"gvisor.dev/gvisor/pkg/sentry/socket/unix"
slinux "gvisor.dev/gvisor/pkg/sentry/syscalls/linux"
)
@@ -345,17 +346,18 @@ func sockAddr(t *kernel.Task, addr hostarch.Addr, length uint32) string {
familyStr := SocketFamily.Parse(uint64(family))
switch family {
case linux.AF_INET, linux.AF_INET6, linux.AF_UNIX:
case linux.AF_INET, linux.AF_INET6, linux.AF_PACKET:
fa, _, err := socket.AddressAndFamily(b)
if err != nil {
return fmt.Sprintf("%#x {Family: %s, error extracting address: %v}", addr, familyStr, err)
}
if family == linux.AF_UNIX {
return fmt.Sprintf("%#x {Family: %s, Addr: %q}", addr, familyStr, string(fa.Addr.AsSlice()))
}
return fmt.Sprintf("%#x {Family: %s, Addr: %v, Port: %d}", addr, familyStr, fa.Addr, fa.Port)
case linux.AF_UNIX:
fa, _, err := unix.AddressAndFamily(b)
if err != nil {
return fmt.Sprintf("%#x {Family: %s, error extracting address: %v}", addr, familyStr, err)
}
return fmt.Sprintf("%#x {Family: %s, Addr: %q}", addr, familyStr, fa.Addr)
case linux.AF_NETLINK:
sa, err := netlink.ExtractSockAddr(b)
if err != nil {