What happened:
GetDomainAddress in pkg/dns/dns.go dereferences the map-lookup result before checking whether the domain was actually found, so a cache miss panics with a nil-pointer dereference.
func (r *DNSResolver) GetDomainAddress(domain string) ([]string, bool) {
r.RLock()
addresses, ok := r.cache[domain] // dns.go:274 — addresses is nil when ok == false
r.RUnlock()
return addresses.Addresses, ok // dns.go:276 — dereferences nil *DomainCacheEntry
}
r.cache is a map[string]*DomainCacheEntry. On a miss, addresses is a nil *DomainCacheEntry and ok is false, but the code still evaluates addresses.Addresses and panics. The ok value is computed but never used to guard the field access.
The two sibling accessors in the same package guard this correctly, which shows the intended pattern:
GetDNSAddresses (pkg/dns/utils.go:110): if entry, ok := r.cache[domain]; ok { return entry.Addresses }
getByNamespace (pkg/auth/policy_store.go:122): if s, ok := ps.byNamespace[namespace]; ok { ... }
GetDomainAddress is the only place in the tree that reads the value before the ok check.
What you expected to happen:
On a cache miss, return nil, false instead of panicking:
func (r *DNSResolver) GetDomainAddress(domain string) ([]string, bool) {
r.RLock()
defer r.RUnlock()
if entry, ok := r.cache[domain]; ok {
return entry.Addresses, true
}
return nil, false
}
How to reproduce it (as minimally and precisely as possible):
Unit test:
r, _ := NewDNSResolver()
r.GetDomainAddress("absent.example.com") // panics: runtime error: invalid memory address or nil pointer dereference
Anything else we need to know?:
GetDomainAddress currently has no non-test callers, so this is a latent landmine rather than an active crash today - but it is an unambiguous bug and will panic the first time it is called with an unknown domain. Trivial, obviously-correct fix.
Environment:
- Kmesh version: main (current,
a28a1a19)
- Kmesh mode(kmesh has
Kernel-Native Mode and Dual-Engine Mode): N/A (bug is in shared DNS resolver code)
- Istio version: N/A
- Kernel version: N/A
- Others: N/A
What happened:
GetDomainAddressinpkg/dns/dns.godereferences the map-lookup result before checking whether the domain was actually found, so a cache miss panics with a nil-pointer dereference.r.cacheis amap[string]*DomainCacheEntry. On a miss,addressesis a nil*DomainCacheEntryandokisfalse, but the code still evaluatesaddresses.Addressesand panics. Theokvalue is computed but never used to guard the field access.The two sibling accessors in the same package guard this correctly, which shows the intended pattern:
GetDNSAddresses(pkg/dns/utils.go:110):if entry, ok := r.cache[domain]; ok { return entry.Addresses }getByNamespace(pkg/auth/policy_store.go:122):if s, ok := ps.byNamespace[namespace]; ok { ... }GetDomainAddressis the only place in the tree that reads the value before theokcheck.What you expected to happen:
On a cache miss, return
nil, falseinstead of panicking:How to reproduce it (as minimally and precisely as possible):
Unit test:
Anything else we need to know?:
GetDomainAddresscurrently has no non-test callers, so this is a latent landmine rather than an active crash today - but it is an unambiguous bug and will panic the first time it is called with an unknown domain. Trivial, obviously-correct fix.Environment:
a28a1a19)Kernel-Native ModeandDual-Engine Mode): N/A (bug is in shared DNS resolver code)