diff --git a/service.go b/service.go index 1ea0320..5a483a9 100644 --- a/service.go +++ b/service.go @@ -423,7 +423,7 @@ func (service *Service) ResolveTXTRecords(name string) (ResolveTXTResult, bool) return ResolveTXTResult{}, false } return ResolveTXTResult{ - TXT: append([]string(nil), record.TXT...), + TXT: cloneStrings(record.TXT), }, true } @@ -573,10 +573,10 @@ func (service *Service) findRecord(name string) (NameRecords, bool) { func resolveResult(record NameRecords) ResolveAllResult { return ResolveAllResult{ - A: append([]string(nil), record.A...), - AAAA: append([]string(nil), record.AAAA...), - TXT: append([]string(nil), record.TXT...), - NS: append([]string(nil), record.NS...), + A: cloneStrings(record.A), + AAAA: cloneStrings(record.AAAA), + TXT: cloneStrings(record.TXT), + NS: cloneStrings(record.NS), } } @@ -699,6 +699,13 @@ func serializeRecordValues(values []string) string { return strings.Join(copied, ",") } +func cloneStrings(values []string) []string { + if len(values) == 0 { + return []string{} + } + return append([]string(nil), values...) +} + func findWildcardMatch(name string, records map[string]NameRecords) (NameRecords, bool) { bestMatch := "" for candidate := range records { diff --git a/service_test.go b/service_test.go index 4456dc9..67dd0ba 100644 --- a/service_test.go +++ b/service_test.go @@ -1229,6 +1229,41 @@ func TestServiceResolveAllSynthesizesNSForDerivedZoneApex(t *testing.T) { } } +func TestServiceResolveAllReturnsEmptyArraysForMissingRecordValues(t *testing.T) { + service := NewService(ServiceOptions{ + Records: map[string]NameRecords{ + "gateway.charon.lthn": { + A: []string{"10.10.10.10"}, + }, + "node.charon.lthn": { + AAAA: []string{"2600:1f1c:7f0:4f01::2"}, + }, + }, + }) + + result, ok := service.ResolveAll("gateway.charon.lthn") + if !ok { + t.Fatal("expected record to resolve") + } + if result.AAAA == nil || len(result.AAAA) != 0 { + t.Fatalf("expected empty AAAA slice, got %#v", result.AAAA) + } + if result.TXT == nil || len(result.TXT) != 0 { + t.Fatalf("expected empty TXT slice, got %#v", result.TXT) + } + if result.NS == nil || len(result.NS) != 0 { + t.Fatalf("expected empty NS slice, got %#v", result.NS) + } + + raw, err := json.Marshal(result) + if err != nil { + t.Fatalf("expected result to marshal: %v", err) + } + if string(raw) != `{"a":["10.10.10.10"],"aaaa":[],"txt":[],"ns":[]}` { + t.Fatalf("expected empty arrays in JSON, got %s", raw) + } +} + func TestServiceServeReturnsNXDOMAINWhenMissing(t *testing.T) { service := NewService(ServiceOptions{})