From d0f533f94af2adc2914c0d4c50d19523353b1e13 Mon Sep 17 00:00:00 2001 From: Exclude0122 <173652916+Exclude0122@users.noreply.github.com> Date: Sat, 25 Apr 2026 13:45:03 -0400 Subject: [PATCH] app/router/condition.go: Retrieve original target in net.FindProcess() when "IPIfNonMatch" is enabled (#5979) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes https://github.com/XTLS/Xray-core/issues/5980 --------- Co-authored-by: 风扇滑翔翼 --- app/router/condition.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/router/condition.go b/app/router/condition.go index 1aae8323..b8a48259 100644 --- a/app/router/condition.go +++ b/app/router/condition.go @@ -12,6 +12,7 @@ import ( "github.com/xtls/xray-core/common/geodata" "github.com/xtls/xray-core/common/net" "github.com/xtls/xray-core/features/routing" + "github.com/xtls/xray-core/features/routing/dns" ) type Condition interface { @@ -356,7 +357,13 @@ func (m *ProcessNameMatcher) Apply(ctx routing.Context) bool { var dstIP string var dstPort uint16 = 0 - if len(ctx.GetTargetIPs()) > 0 { + + // do not use resolved IP because Android process lookup needs original dst ip + resolvableContext, ok := ctx.(*dns.ResolvableContext) + if ok && len(resolvableContext.Context.GetTargetIPs()) > 0 { + dstIP = resolvableContext.Context.GetTargetIPs()[0].String() + dstPort = uint16(resolvableContext.Context.GetTargetPort()) + } else if len(ctx.GetTargetIPs()) > 0 { dstIP = ctx.GetTargetIPs()[0].String() dstPort = uint16(ctx.GetTargetPort()) }