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:
Ian Gudger
2020-02-07 14:01:47 -08:00
committed by gVisor bot
parent 6de49546cb
commit e1587a2887
4 changed files with 258 additions and 5 deletions
+2 -2
View File
@@ -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"),
+215
View File
@@ -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",
},
}
+21 -1
View File
@@ -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])
}
}
}
+20 -2
View File
@@ -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