handleGetpeername handles the getpeername(2) syscall to emulate the external connection's peer address.
(n *seccomp.Notif, fd int, addrPtr uintptr, addrSizePtr uintptr)
| 544 | // handleGetpeername handles the getpeername(2) syscall to emulate the external |
| 545 | // connection's peer address. |
| 546 | func (p *Process) handleGetpeername(n *seccomp.Notif, fd int, addrPtr uintptr, addrSizePtr uintptr) error { |
| 547 | s, ok := p.getSocket(fd) |
| 548 | if !ok { |
| 549 | return n.Skip() |
| 550 | } |
| 551 | |
| 552 | peer, errno, err := s.PeerAddr() |
| 553 | if err != nil { |
| 554 | return fmt.Errorf("get peer addr: %w", err) |
| 555 | } |
| 556 | if errno != 0 { |
| 557 | return n.Return(0, errno) |
| 558 | } |
| 559 | |
| 560 | if !peer.IsValid() { |
| 561 | return n.Return(0, unix.ENOTCONN) |
| 562 | } |
| 563 | |
| 564 | if s.Inode.Domain == unix.AF_INET6 && peer.Addr().Is4() { |
| 565 | peer = netip.AddrPortFrom(netip.AddrFrom16(peer.Addr().As16()), peer.Port()) |
| 566 | } |
| 567 | |
| 568 | if addrPtr == 0 || addrSizePtr == 0 { |
| 569 | return n.Return(0, unix.EFAULT) |
| 570 | } |
| 571 | errno, err = p.vmWriteSockaddr(n, peer, addrPtr, addrSizePtr) |
| 572 | if err != nil { |
| 573 | return fmt.Errorf("write peer addr: %w", err) |
| 574 | } |
| 575 | return n.Return(0, errno) |
| 576 | } |
| 577 | |
| 578 | var Handlers [1024]func(*Process, *seccomp.Notif) error |
| 579 |