From c9a57e931d0d1993b88625b9dc142a03dbee2374 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A3=8E=E6=89=87=E6=BB=91=E7=BF=94=E7=BF=BC?= Date: Thu, 22 Oct 2026 17:18:51 +0000 Subject: [PATCH] Fix linux IPv6 process routing --- common/net/find_process_linux.go | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/common/net/find_process_linux.go b/common/net/find_process_linux.go index 2e661a4de..c4dca85a1 100644 --- a/common/net/find_process_linux.go +++ b/common/net/find_process_linux.go @@ -4,7 +4,7 @@ package net import ( "bufio" - "encoding/hex" + "encoding/binary" "fmt" "net" "os" @@ -45,10 +45,7 @@ func FindProcess(network, srcIP string, srcPort uint16, destIP string, destPort panic("Unsupported network type for process lookup.") } - targetHexAddr, err := formatLittleEndianString(net.ParseIP(srcIP), Port(srcPort)) - if err != nil { - return 0, "", "", errors.New("failed to format address: ", err) - } + targetHexAddr := formatProcNetAddress(net.ParseIP(srcIP), Port(srcPort)) inode, err := findInodeInFile(procFile, targetHexAddr) if err != nil { @@ -82,24 +79,21 @@ func FindProcess(network, srcIP string, srcPort uint16, destIP string, destPort return pid, procName, absPath, nil } -func formatLittleEndianString(addr net.IP, port Port) (string, error) { - ip := addr +func formatProcNetAddress(addr net.IP, port Port) string { var ipBytes []byte - if ip.To4() != nil { - ipBytes = ip.To4() + if ipv4 := addr.To4(); ipv4 != nil { + ipBytes = ipv4 } else { - ipBytes = ip.To16() - } - if ipBytes == nil { - return "", errors.New("invalid IP format for ", addr, ": ", ip) + ipBytes = addr.To16() } - for i, j := 0, len(ipBytes)-1; i < j; i, j = i+1, j-1 { - ipBytes[i], ipBytes[j] = ipBytes[j], ipBytes[i] + var formatted strings.Builder + formatted.Grow(len(ipBytes)*2 + 5) + for i := 0; i < len(ipBytes); i += 4 { + fmt.Fprintf(&formatted, "%08X", binary.NativeEndian.Uint32(ipBytes[i:i+4])) } - portHex := fmt.Sprintf("%04X", uint16(port)) - ipHex := strings.ToUpper(hex.EncodeToString(ipBytes)) - return fmt.Sprintf("%s:%s", ipHex, portHex), nil + fmt.Fprintf(&formatted, ":%04X", uint16(port)) + return formatted.String() } func findInodeInFile(filePath, targetHexAddr string) (string, error) {