searcher_linux_shared_test.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. //go:build linux
  2. package process
  3. import (
  4. "net"
  5. "net/netip"
  6. "os"
  7. "syscall"
  8. "testing"
  9. "time"
  10. "github.com/stretchr/testify/require"
  11. )
  12. func TestQuerySocketDiagUDPExact(t *testing.T) {
  13. t.Parallel()
  14. server, err := net.ListenUDP("udp4", &net.UDPAddr{IP: net.IPv4(127, 0, 0, 1), Port: 0})
  15. require.NoError(t, err)
  16. defer server.Close()
  17. client, err := net.DialUDP("udp4", nil, server.LocalAddr().(*net.UDPAddr))
  18. require.NoError(t, err)
  19. defer client.Close()
  20. err = client.SetDeadline(time.Now().Add(time.Second))
  21. require.NoError(t, err)
  22. _, err = client.Write([]byte{0})
  23. require.NoError(t, err)
  24. err = server.SetReadDeadline(time.Now().Add(time.Second))
  25. require.NoError(t, err)
  26. buffer := make([]byte, 1)
  27. _, _, err = server.ReadFromUDP(buffer)
  28. require.NoError(t, err)
  29. source := addrPortFromUDPAddr(t, client.LocalAddr())
  30. destination := addrPortFromUDPAddr(t, client.RemoteAddr())
  31. fd, err := openSocketDiag()
  32. require.NoError(t, err)
  33. defer syscall.Close(fd)
  34. inode, uid, err := querySocketDiag(fd, packSocketDiagRequest(syscall.AF_INET, syscall.IPPROTO_UDP, source, destination, false))
  35. require.NoError(t, err)
  36. require.NotZero(t, inode)
  37. require.EqualValues(t, os.Getuid(), uid)
  38. }
  39. func addrPortFromUDPAddr(t *testing.T, addr net.Addr) netip.AddrPort {
  40. t.Helper()
  41. udpAddr, ok := addr.(*net.UDPAddr)
  42. require.True(t, ok)
  43. ip, ok := netip.AddrFromSlice(udpAddr.IP)
  44. require.True(t, ok)
  45. return netip.AddrPortFrom(ip.Unmap(), uint16(udpAddr.Port))
  46. }