| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- //go:build linux
- package process
- import (
- "net"
- "net/netip"
- "os"
- "syscall"
- "testing"
- "time"
- "github.com/stretchr/testify/require"
- )
- func TestQuerySocketDiagUDPExact(t *testing.T) {
- t.Parallel()
- server, err := net.ListenUDP("udp4", &net.UDPAddr{IP: net.IPv4(127, 0, 0, 1), Port: 0})
- require.NoError(t, err)
- defer server.Close()
- client, err := net.DialUDP("udp4", nil, server.LocalAddr().(*net.UDPAddr))
- require.NoError(t, err)
- defer client.Close()
- err = client.SetDeadline(time.Now().Add(time.Second))
- require.NoError(t, err)
- _, err = client.Write([]byte{0})
- require.NoError(t, err)
- err = server.SetReadDeadline(time.Now().Add(time.Second))
- require.NoError(t, err)
- buffer := make([]byte, 1)
- _, _, err = server.ReadFromUDP(buffer)
- require.NoError(t, err)
- source := addrPortFromUDPAddr(t, client.LocalAddr())
- destination := addrPortFromUDPAddr(t, client.RemoteAddr())
- fd, err := openSocketDiag()
- require.NoError(t, err)
- defer syscall.Close(fd)
- inode, uid, err := querySocketDiag(fd, packSocketDiagRequest(syscall.AF_INET, syscall.IPPROTO_UDP, source, destination, false))
- require.NoError(t, err)
- require.NotZero(t, inode)
- require.EqualValues(t, os.Getuid(), uid)
- }
- func addrPortFromUDPAddr(t *testing.T, addr net.Addr) netip.AddrPort {
- t.Helper()
- udpAddr, ok := addr.(*net.UDPAddr)
- require.True(t, ok)
- ip, ok := netip.AddrFromSlice(udpAddr.IP)
- require.True(t, ok)
- return netip.AddrPortFrom(ip.Unmap(), uint16(udpAddr.Port))
- }
|