vmWriteSockaddr writes a sockaddr struct and its length to the process' memory at ptr. It panics if addr is invalid or if ptr/sizePtr is NULL.
(n *seccomp.Notif, addr netip.AddrPort, ptr uintptr, sizePtr uintptr)
| 206 | // vmWriteSockaddr writes a sockaddr struct and its length to the process' |
| 207 | // memory at ptr. It panics if addr is invalid or if ptr/sizePtr is NULL. |
| 208 | func (p *Process) vmWriteSockaddr(n *seccomp.Notif, addr netip.AddrPort, ptr uintptr, sizePtr uintptr) (syscall.Errno, error) { |
| 209 | if !addr.IsValid() { |
| 210 | panic("invalid AddrPort") |
| 211 | } |
| 212 | if ptr == 0 || sizePtr == 0 { |
| 213 | panic(fmt.Sprintf("NULL: ptr=%x, sizePtr=%x", ptr, sizePtr)) |
| 214 | } |
| 215 | |
| 216 | avail, errno, err := p.vmReadUint32(n, sizePtr) |
| 217 | if errno != 0 || err != nil { |
| 218 | return errno, err |
| 219 | } |
| 220 | if avail < 0 { |
| 221 | return unix.EINVAL, nil |
| 222 | } |
| 223 | |
| 224 | var sa linux.SockAddr |
| 225 | switch { |
| 226 | case addr.Addr().Is6() || addr.Addr().Is4In6(): |
| 227 | sa = &linux.SockAddrInet6{ |
| 228 | Family: unix.AF_INET6, |
| 229 | Addr: linux.Inet6Addr(addr.Addr().As16()), |
| 230 | Port: htons(addr.Port()), |
| 231 | } |
| 232 | case addr.Addr().Is4(): |
| 233 | sa = &linux.SockAddrInet{ |
| 234 | Family: unix.AF_INET, |
| 235 | Addr: linux.InetAddr(addr.Addr().As4()), |
| 236 | Port: htons(addr.Port()), |
| 237 | } |
| 238 | } |
| 239 | |
| 240 | b := make([]byte, sa.SizeBytes(), sa.SizeBytes()) |
| 241 | sa.MarshalBytes(b) |
| 242 | if uint32(sa.SizeBytes()) > avail { |
| 243 | b = b[:avail] |
| 244 | } |
| 245 | |
| 246 | if errno, err := p.vmWriteBytes(n, ptr, b); errno != 0 || err != nil { |
| 247 | return errno, err |
| 248 | } |
| 249 | if errno, err := p.vmWriteUint32(n, sizePtr, uint32(sa.SizeBytes())); errno != 0 || err != nil { |
| 250 | return errno, err |
| 251 | } |
| 252 | return 0, nil |
| 253 | } |
no test coverage detected