mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Log level, optname, optval and optlen in getsockopt/setsockopt in strace.
Log 8, 16, and 32 int optvals and dump the memory of other sizes. Updates #1782 PiperOrigin-RevId: 293889388
This commit is contained in:
@@ -78,8 +78,8 @@ var linuxAMD64 = SyscallMap{
|
||||
51: makeSyscallInfo("getsockname", FD, PostSockAddr, SockLen),
|
||||
52: makeSyscallInfo("getpeername", FD, PostSockAddr, SockLen),
|
||||
53: makeSyscallInfo("socketpair", SockFamily, SockType, SockProtocol, Hex),
|
||||
54: makeSyscallInfo("setsockopt", FD, Hex, Hex, Hex, Hex),
|
||||
55: makeSyscallInfo("getsockopt", FD, Hex, Hex, Hex, Hex),
|
||||
54: makeSyscallInfo("setsockopt", FD, SockOptLevel, SockOptName, SetSockOptVal, Hex /* length by value, not a pointer */),
|
||||
55: makeSyscallInfo("getsockopt", FD, SockOptLevel, SockOptName, GetSockOptVal, SockLen),
|
||||
56: makeSyscallInfo("clone", CloneFlags, Hex, Hex, Hex, Hex),
|
||||
57: makeSyscallInfo("fork"),
|
||||
58: makeSyscallInfo("vfork"),
|
||||
|
||||
@@ -419,3 +419,218 @@ func sockFlags(flags int32) string {
|
||||
}
|
||||
return SocketFlagSet.Parse(uint64(flags))
|
||||
}
|
||||
|
||||
func getSockOptVal(t *kernel.Task, level, optname uint64, optVal usermem.Addr, optLen usermem.Addr, maximumBlobSize uint, rval uintptr) string {
|
||||
if int(rval) < 0 {
|
||||
return hexNum(uint64(optVal))
|
||||
}
|
||||
if optVal == 0 {
|
||||
return "null"
|
||||
}
|
||||
l, err := copySockLen(t, optLen)
|
||||
if err != nil {
|
||||
return fmt.Sprintf("%#x {error reading length: %v}", optLen, err)
|
||||
}
|
||||
return sockOptVal(t, level, optname, optVal, uint64(l), maximumBlobSize)
|
||||
}
|
||||
|
||||
func sockOptVal(t *kernel.Task, level, optname uint64, optVal usermem.Addr, optLen uint64, maximumBlobSize uint) string {
|
||||
switch optLen {
|
||||
case 1:
|
||||
var v uint8
|
||||
_, err := t.CopyIn(optVal, &v)
|
||||
if err != nil {
|
||||
return fmt.Sprintf("%#x {error reading optval: %v}", optVal, err)
|
||||
}
|
||||
return fmt.Sprintf("%#x {value=%v}", optVal, v)
|
||||
case 2:
|
||||
var v uint16
|
||||
_, err := t.CopyIn(optVal, &v)
|
||||
if err != nil {
|
||||
return fmt.Sprintf("%#x {error reading optval: %v}", optVal, err)
|
||||
}
|
||||
return fmt.Sprintf("%#x {value=%v}", optVal, v)
|
||||
case 4:
|
||||
var v uint32
|
||||
_, err := t.CopyIn(optVal, &v)
|
||||
if err != nil {
|
||||
return fmt.Sprintf("%#x {error reading optval: %v}", optVal, err)
|
||||
}
|
||||
return fmt.Sprintf("%#x {value=%v}", optVal, v)
|
||||
default:
|
||||
return dump(t, optVal, uint(optLen), maximumBlobSize)
|
||||
}
|
||||
}
|
||||
|
||||
var sockOptLevels = abi.ValueSet{
|
||||
linux.SOL_IP: "SOL_IP",
|
||||
linux.SOL_SOCKET: "SOL_SOCKET",
|
||||
linux.SOL_TCP: "SOL_TCP",
|
||||
linux.SOL_UDP: "SOL_UDP",
|
||||
linux.SOL_IPV6: "SOL_IPV6",
|
||||
linux.SOL_ICMPV6: "SOL_ICMPV6",
|
||||
linux.SOL_RAW: "SOL_RAW",
|
||||
linux.SOL_PACKET: "SOL_PACKET",
|
||||
linux.SOL_NETLINK: "SOL_NETLINK",
|
||||
}
|
||||
|
||||
var sockOptNames = map[uint64]abi.ValueSet{
|
||||
linux.SOL_IP: {
|
||||
linux.IP_TTL: "IP_TTL",
|
||||
linux.IP_MULTICAST_TTL: "IP_MULTICAST_TTL",
|
||||
linux.IP_MULTICAST_IF: "IP_MULTICAST_IF",
|
||||
linux.IP_MULTICAST_LOOP: "IP_MULTICAST_LOOP",
|
||||
linux.IP_TOS: "IP_TOS",
|
||||
linux.IP_RECVTOS: "IP_RECVTOS",
|
||||
linux.IPT_SO_GET_INFO: "IPT_SO_GET_INFO",
|
||||
linux.IPT_SO_GET_ENTRIES: "IPT_SO_GET_ENTRIES",
|
||||
linux.IP_ADD_MEMBERSHIP: "IP_ADD_MEMBERSHIP",
|
||||
linux.IP_DROP_MEMBERSHIP: "IP_DROP_MEMBERSHIP",
|
||||
linux.MCAST_JOIN_GROUP: "MCAST_JOIN_GROUP",
|
||||
linux.IP_ADD_SOURCE_MEMBERSHIP: "IP_ADD_SOURCE_MEMBERSHIP",
|
||||
linux.IP_BIND_ADDRESS_NO_PORT: "IP_BIND_ADDRESS_NO_PORT",
|
||||
linux.IP_BLOCK_SOURCE: "IP_BLOCK_SOURCE",
|
||||
linux.IP_CHECKSUM: "IP_CHECKSUM",
|
||||
linux.IP_DROP_SOURCE_MEMBERSHIP: "IP_DROP_SOURCE_MEMBERSHIP",
|
||||
linux.IP_FREEBIND: "IP_FREEBIND",
|
||||
linux.IP_HDRINCL: "IP_HDRINCL",
|
||||
linux.IP_IPSEC_POLICY: "IP_IPSEC_POLICY",
|
||||
linux.IP_MINTTL: "IP_MINTTL",
|
||||
linux.IP_MSFILTER: "IP_MSFILTER",
|
||||
linux.IP_MTU_DISCOVER: "IP_MTU_DISCOVER",
|
||||
linux.IP_MULTICAST_ALL: "IP_MULTICAST_ALL",
|
||||
linux.IP_NODEFRAG: "IP_NODEFRAG",
|
||||
linux.IP_OPTIONS: "IP_OPTIONS",
|
||||
linux.IP_PASSSEC: "IP_PASSSEC",
|
||||
linux.IP_PKTINFO: "IP_PKTINFO",
|
||||
linux.IP_RECVERR: "IP_RECVERR",
|
||||
linux.IP_RECVFRAGSIZE: "IP_RECVFRAGSIZE",
|
||||
linux.IP_RECVOPTS: "IP_RECVOPTS",
|
||||
linux.IP_RECVORIGDSTADDR: "IP_RECVORIGDSTADDR",
|
||||
linux.IP_RECVTTL: "IP_RECVTTL",
|
||||
linux.IP_RETOPTS: "IP_RETOPTS",
|
||||
linux.IP_TRANSPARENT: "IP_TRANSPARENT",
|
||||
linux.IP_UNBLOCK_SOURCE: "IP_UNBLOCK_SOURCE",
|
||||
linux.IP_UNICAST_IF: "IP_UNICAST_IF",
|
||||
linux.IP_XFRM_POLICY: "IP_XFRM_POLICY",
|
||||
linux.MCAST_BLOCK_SOURCE: "MCAST_BLOCK_SOURCE",
|
||||
linux.MCAST_JOIN_SOURCE_GROUP: "MCAST_JOIN_SOURCE_GROUP",
|
||||
linux.MCAST_LEAVE_GROUP: "MCAST_LEAVE_GROUP",
|
||||
linux.MCAST_LEAVE_SOURCE_GROUP: "MCAST_LEAVE_SOURCE_GROUP",
|
||||
linux.MCAST_MSFILTER: "MCAST_MSFILTER",
|
||||
linux.MCAST_UNBLOCK_SOURCE: "MCAST_UNBLOCK_SOURCE",
|
||||
linux.IP_ROUTER_ALERT: "IP_ROUTER_ALERT",
|
||||
linux.IP_PKTOPTIONS: "IP_PKTOPTIONS",
|
||||
linux.IP_MTU: "IP_MTU",
|
||||
},
|
||||
linux.SOL_SOCKET: {
|
||||
linux.SO_ERROR: "SO_ERROR",
|
||||
linux.SO_PEERCRED: "SO_PEERCRED",
|
||||
linux.SO_PASSCRED: "SO_PASSCRED",
|
||||
linux.SO_SNDBUF: "SO_SNDBUF",
|
||||
linux.SO_RCVBUF: "SO_RCVBUF",
|
||||
linux.SO_REUSEADDR: "SO_REUSEADDR",
|
||||
linux.SO_REUSEPORT: "SO_REUSEPORT",
|
||||
linux.SO_BINDTODEVICE: "SO_BINDTODEVICE",
|
||||
linux.SO_BROADCAST: "SO_BROADCAST",
|
||||
linux.SO_KEEPALIVE: "SO_KEEPALIVE",
|
||||
linux.SO_LINGER: "SO_LINGER",
|
||||
linux.SO_SNDTIMEO: "SO_SNDTIMEO",
|
||||
linux.SO_RCVTIMEO: "SO_RCVTIMEO",
|
||||
linux.SO_OOBINLINE: "SO_OOBINLINE",
|
||||
linux.SO_TIMESTAMP: "SO_TIMESTAMP",
|
||||
},
|
||||
linux.SOL_TCP: {
|
||||
linux.TCP_NODELAY: "TCP_NODELAY",
|
||||
linux.TCP_CORK: "TCP_CORK",
|
||||
linux.TCP_QUICKACK: "TCP_QUICKACK",
|
||||
linux.TCP_MAXSEG: "TCP_MAXSEG",
|
||||
linux.TCP_KEEPIDLE: "TCP_KEEPIDLE",
|
||||
linux.TCP_KEEPINTVL: "TCP_KEEPINTVL",
|
||||
linux.TCP_USER_TIMEOUT: "TCP_USER_TIMEOUT",
|
||||
linux.TCP_INFO: "TCP_INFO",
|
||||
linux.TCP_CC_INFO: "TCP_CC_INFO",
|
||||
linux.TCP_NOTSENT_LOWAT: "TCP_NOTSENT_LOWAT",
|
||||
linux.TCP_ZEROCOPY_RECEIVE: "TCP_ZEROCOPY_RECEIVE",
|
||||
linux.TCP_CONGESTION: "TCP_CONGESTION",
|
||||
linux.TCP_LINGER2: "TCP_LINGER2",
|
||||
linux.TCP_DEFER_ACCEPT: "TCP_DEFER_ACCEPT",
|
||||
linux.TCP_REPAIR_OPTIONS: "TCP_REPAIR_OPTIONS",
|
||||
linux.TCP_INQ: "TCP_INQ",
|
||||
linux.TCP_FASTOPEN: "TCP_FASTOPEN",
|
||||
linux.TCP_FASTOPEN_CONNECT: "TCP_FASTOPEN_CONNECT",
|
||||
linux.TCP_FASTOPEN_KEY: "TCP_FASTOPEN_KEY",
|
||||
linux.TCP_FASTOPEN_NO_COOKIE: "TCP_FASTOPEN_NO_COOKIE",
|
||||
linux.TCP_KEEPCNT: "TCP_KEEPCNT",
|
||||
linux.TCP_QUEUE_SEQ: "TCP_QUEUE_SEQ",
|
||||
linux.TCP_REPAIR: "TCP_REPAIR",
|
||||
linux.TCP_REPAIR_QUEUE: "TCP_REPAIR_QUEUE",
|
||||
linux.TCP_REPAIR_WINDOW: "TCP_REPAIR_WINDOW",
|
||||
linux.TCP_SAVED_SYN: "TCP_SAVED_SYN",
|
||||
linux.TCP_SAVE_SYN: "TCP_SAVE_SYN",
|
||||
linux.TCP_SYNCNT: "TCP_SYNCNT",
|
||||
linux.TCP_THIN_DUPACK: "TCP_THIN_DUPACK",
|
||||
linux.TCP_THIN_LINEAR_TIMEOUTS: "TCP_THIN_LINEAR_TIMEOUTS",
|
||||
linux.TCP_TIMESTAMP: "TCP_TIMESTAMP",
|
||||
linux.TCP_ULP: "TCP_ULP",
|
||||
linux.TCP_WINDOW_CLAMP: "TCP_WINDOW_CLAMP",
|
||||
},
|
||||
linux.SOL_IPV6: {
|
||||
linux.IPV6_V6ONLY: "IPV6_V6ONLY",
|
||||
linux.IPV6_PATHMTU: "IPV6_PATHMTU",
|
||||
linux.IPV6_TCLASS: "IPV6_TCLASS",
|
||||
linux.IPV6_ADD_MEMBERSHIP: "IPV6_ADD_MEMBERSHIP",
|
||||
linux.IPV6_DROP_MEMBERSHIP: "IPV6_DROP_MEMBERSHIP",
|
||||
linux.IPV6_IPSEC_POLICY: "IPV6_IPSEC_POLICY",
|
||||
linux.IPV6_JOIN_ANYCAST: "IPV6_JOIN_ANYCAST",
|
||||
linux.IPV6_LEAVE_ANYCAST: "IPV6_LEAVE_ANYCAST",
|
||||
linux.IPV6_PKTINFO: "IPV6_PKTINFO",
|
||||
linux.IPV6_ROUTER_ALERT: "IPV6_ROUTER_ALERT",
|
||||
linux.IPV6_XFRM_POLICY: "IPV6_XFRM_POLICY",
|
||||
linux.MCAST_BLOCK_SOURCE: "MCAST_BLOCK_SOURCE",
|
||||
linux.MCAST_JOIN_GROUP: "MCAST_JOIN_GROUP",
|
||||
linux.MCAST_JOIN_SOURCE_GROUP: "MCAST_JOIN_SOURCE_GROUP",
|
||||
linux.MCAST_LEAVE_GROUP: "MCAST_LEAVE_GROUP",
|
||||
linux.MCAST_LEAVE_SOURCE_GROUP: "MCAST_LEAVE_SOURCE_GROUP",
|
||||
linux.MCAST_UNBLOCK_SOURCE: "MCAST_UNBLOCK_SOURCE",
|
||||
linux.IPV6_2292DSTOPTS: "IPV6_2292DSTOPTS",
|
||||
linux.IPV6_2292HOPLIMIT: "IPV6_2292HOPLIMIT",
|
||||
linux.IPV6_2292HOPOPTS: "IPV6_2292HOPOPTS",
|
||||
linux.IPV6_2292PKTINFO: "IPV6_2292PKTINFO",
|
||||
linux.IPV6_2292PKTOPTIONS: "IPV6_2292PKTOPTIONS",
|
||||
linux.IPV6_2292RTHDR: "IPV6_2292RTHDR",
|
||||
linux.IPV6_ADDR_PREFERENCES: "IPV6_ADDR_PREFERENCES",
|
||||
linux.IPV6_AUTOFLOWLABEL: "IPV6_AUTOFLOWLABEL",
|
||||
linux.IPV6_DONTFRAG: "IPV6_DONTFRAG",
|
||||
linux.IPV6_DSTOPTS: "IPV6_DSTOPTS",
|
||||
linux.IPV6_FLOWINFO: "IPV6_FLOWINFO",
|
||||
linux.IPV6_FLOWINFO_SEND: "IPV6_FLOWINFO_SEND",
|
||||
linux.IPV6_FLOWLABEL_MGR: "IPV6_FLOWLABEL_MGR",
|
||||
linux.IPV6_FREEBIND: "IPV6_FREEBIND",
|
||||
linux.IPV6_HOPOPTS: "IPV6_HOPOPTS",
|
||||
linux.IPV6_MINHOPCOUNT: "IPV6_MINHOPCOUNT",
|
||||
linux.IPV6_MTU: "IPV6_MTU",
|
||||
linux.IPV6_MTU_DISCOVER: "IPV6_MTU_DISCOVER",
|
||||
linux.IPV6_MULTICAST_ALL: "IPV6_MULTICAST_ALL",
|
||||
linux.IPV6_MULTICAST_HOPS: "IPV6_MULTICAST_HOPS",
|
||||
linux.IPV6_MULTICAST_IF: "IPV6_MULTICAST_IF",
|
||||
linux.IPV6_MULTICAST_LOOP: "IPV6_MULTICAST_LOOP",
|
||||
linux.IPV6_RECVDSTOPTS: "IPV6_RECVDSTOPTS",
|
||||
linux.IPV6_RECVERR: "IPV6_RECVERR",
|
||||
linux.IPV6_RECVFRAGSIZE: "IPV6_RECVFRAGSIZE",
|
||||
linux.IPV6_RECVHOPLIMIT: "IPV6_RECVHOPLIMIT",
|
||||
linux.IPV6_RECVHOPOPTS: "IPV6_RECVHOPOPTS",
|
||||
linux.IPV6_RECVORIGDSTADDR: "IPV6_RECVORIGDSTADDR",
|
||||
linux.IPV6_RECVPATHMTU: "IPV6_RECVPATHMTU",
|
||||
linux.IPV6_RECVPKTINFO: "IPV6_RECVPKTINFO",
|
||||
linux.IPV6_RECVRTHDR: "IPV6_RECVRTHDR",
|
||||
linux.IPV6_RECVTCLASS: "IPV6_RECVTCLASS",
|
||||
linux.IPV6_RTHDR: "IPV6_RTHDR",
|
||||
linux.IPV6_RTHDRDSTOPTS: "IPV6_RTHDRDSTOPTS",
|
||||
linux.IPV6_TRANSPARENT: "IPV6_TRANSPARENT",
|
||||
linux.IPV6_UNICAST_HOPS: "IPV6_UNICAST_HOPS",
|
||||
linux.IPV6_UNICAST_IF: "IPV6_UNICAST_IF",
|
||||
linux.MCAST_MSFILTER: "MCAST_MSFILTER",
|
||||
linux.IPV6_ADDRFORM: "IPV6_ADDRFORM",
|
||||
},
|
||||
}
|
||||
|
||||
@@ -55,6 +55,14 @@ var ItimerTypes = abi.ValueSet{
|
||||
linux.ITIMER_PROF: "ITIMER_PROF",
|
||||
}
|
||||
|
||||
func hexNum(num uint64) string {
|
||||
return "0x" + strconv.FormatUint(num, 16)
|
||||
}
|
||||
|
||||
func hexArg(arg arch.SyscallArgument) string {
|
||||
return hexNum(arg.Uint64())
|
||||
}
|
||||
|
||||
func iovecs(t *kernel.Task, addr usermem.Addr, iovcnt int, printContent bool, maxBytes uint64) string {
|
||||
if iovcnt < 0 || iovcnt > linux.UIO_MAXIOV {
|
||||
return fmt.Sprintf("%#x (error decoding iovecs: invalid iovcnt)", addr)
|
||||
@@ -389,6 +397,12 @@ func (i *SyscallInfo) pre(t *kernel.Task, args arch.SyscallArguments, maximumBlo
|
||||
output = append(output, path(t, args[arg].Pointer()))
|
||||
case ExecveStringVector:
|
||||
output = append(output, stringVector(t, args[arg].Pointer()))
|
||||
case SetSockOptVal:
|
||||
output = append(output, sockOptVal(t, args[arg-2].Uint64() /* level */, args[arg-1].Uint64() /* optName */, args[arg].Pointer() /* optVal */, args[arg+1].Uint64() /* optLen */, maximumBlobSize))
|
||||
case SockOptLevel:
|
||||
output = append(output, sockOptLevels.Parse(args[arg].Uint64()))
|
||||
case SockOptName:
|
||||
output = append(output, sockOptNames[args[arg-1].Uint64() /* level */].Parse(args[arg].Uint64()))
|
||||
case SockAddr:
|
||||
output = append(output, sockAddr(t, args[arg].Pointer(), uint32(args[arg+1].Uint64())))
|
||||
case SockLen:
|
||||
@@ -446,7 +460,7 @@ func (i *SyscallInfo) pre(t *kernel.Task, args arch.SyscallArguments, maximumBlo
|
||||
case Hex:
|
||||
fallthrough
|
||||
default:
|
||||
output = append(output, "0x"+strconv.FormatUint(args[arg].Uint64(), 16))
|
||||
output = append(output, hexArg(args[arg]))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -507,6 +521,12 @@ func (i *SyscallInfo) post(t *kernel.Task, args arch.SyscallArguments, rval uint
|
||||
output[arg] = capData(t, args[arg-1].Pointer(), args[arg].Pointer())
|
||||
case PollFDs:
|
||||
output[arg] = pollFDs(t, args[arg].Pointer(), uint(args[arg+1].Uint()), true)
|
||||
case GetSockOptVal:
|
||||
output[arg] = getSockOptVal(t, args[arg-2].Uint64() /* level */, args[arg-1].Uint64() /* optName */, args[arg].Pointer() /* optVal */, args[arg+1].Pointer() /* optLen */, maximumBlobSize, rval)
|
||||
case SetSockOptVal:
|
||||
// No need to print the value again. While it usually
|
||||
// isn't, the string version of this arg can be long.
|
||||
output[arg] = hexArg(args[arg])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -207,9 +207,27 @@ const (
|
||||
// array is in the next argument.
|
||||
PollFDs
|
||||
|
||||
// SelectFDSet is an fd_set argument in select(2)/pselect(2). The number of
|
||||
// fds represented must be the first argument.
|
||||
// SelectFDSet is an fd_set argument in select(2)/pselect(2). The
|
||||
// number of FDs represented must be the first argument.
|
||||
SelectFDSet
|
||||
|
||||
// GetSockOptVal is the optval argument in getsockopt(2).
|
||||
//
|
||||
// Formatted after syscall execution.
|
||||
GetSockOptVal
|
||||
|
||||
// SetSockOptVal is the optval argument in setsockopt(2).
|
||||
//
|
||||
// Contents omitted after syscall execution.
|
||||
SetSockOptVal
|
||||
|
||||
// SockOptLevel is the level argument in getsockopt(2) and
|
||||
// setsockopt(2).
|
||||
SockOptLevel
|
||||
|
||||
// SockOptLevel is the optname argument in getsockopt(2) and
|
||||
// setsockopt(2).
|
||||
SockOptName
|
||||
)
|
||||
|
||||
// defaultFormat is the syscall argument format to use if the actual format is
|
||||
|
||||
Reference in New Issue
Block a user