fix memory leak in dns templates (#3676)

* fix memory leak

* update test to cover the string slice case
This commit is contained in:
Shubham Rasal 2023-05-12 17:29:37 +05:30 committed by GitHub
parent e995b0ce48
commit 06ab56abea
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 12 additions and 7 deletions

View File

@ -96,7 +96,10 @@ func (request *Request) responseToDSLMap(req, resp *dns.Msg, host, matched strin
"type": request.Type().String(), "type": request.Type().String(),
"trace": traceToString(traceData, false), "trace": traceToString(traceData, false),
} }
return generators.MergeMaps(ret, recordsKeyValue(resp.Answer)) if len(resp.Answer) > 0 {
ret = generators.MergeMaps(ret, recordsKeyValue(resp.Answer))
}
return ret
} }
// MakeResultEvent creates a result event from internal wrapped event // MakeResultEvent creates a result event from internal wrapped event
@ -156,12 +159,14 @@ func recordsKeyValue(resourceRecords []dns.RR) output.InternalEvent {
key := strings.ToLower(dns.TypeToString[resourceRecord.Header().Rrtype]) key := strings.ToLower(dns.TypeToString[resourceRecord.Header().Rrtype])
value := strings.ReplaceAll(resourceRecord.String(), resourceRecord.Header().String(), "") value := strings.ReplaceAll(resourceRecord.String(), resourceRecord.Header().String(), "")
if preVal, ok := oe[key]; ok { // if the key is already present, we need to convert the value to a slice
switch v := oe[key].(type) { // if the key has slice, then append the value to the slice
if previous, ok := oe[key]; ok {
switch v := previous.(type) {
case string: case string:
oe[key] = []string{value, preVal.(string)} oe[key] = []string{v, value}
case []string: case []string:
oe[key] = append(v, preVal.([]string)...) oe[key] = append(v, value)
} }
continue continue
} }

View File

@ -43,12 +43,12 @@ func TestResponseToDSLMap(t *testing.T) {
resp := new(dns.Msg) resp := new(dns.Msg)
resp.Rcode = dns.RcodeSuccess resp.Rcode = dns.RcodeSuccess
resp.Answer = append(resp.Answer, &dns.A{A: net.ParseIP("1.1.1.1"), Hdr: dns.RR_Header{Name: "one.one.one.one.", Rrtype: dns.TypeA}}, &dns.A{A: net.ParseIP("2.2.2.2"), Hdr: dns.RR_Header{Name: "one.one.one.one.", Rrtype: dns.TypeA}}) resp.Answer = append(resp.Answer, &dns.A{A: net.ParseIP("1.1.1.1"), Hdr: dns.RR_Header{Name: "one.one.one.one.", Rrtype: dns.TypeA}}, &dns.A{A: net.ParseIP("2.2.2.2"), Hdr: dns.RR_Header{Name: "one.one.one.one.", Rrtype: dns.TypeA}}, &dns.A{A: net.ParseIP("3.3.3.3"), Hdr: dns.RR_Header{Name: "one.one.one.one.", Rrtype: dns.TypeA}})
event := request.responseToDSLMap(req, resp, "one.one.one.one", "one.one.one.one", nil) event := request.responseToDSLMap(req, resp, "one.one.one.one", "one.one.one.one", nil)
require.Len(t, event, 15, "could not get correct number of items in dsl map") require.Len(t, event, 15, "could not get correct number of items in dsl map")
require.Equal(t, dns.RcodeSuccess, event["rcode"], "could not get correct rcode") require.Equal(t, dns.RcodeSuccess, event["rcode"], "could not get correct rcode")
require.ElementsMatch(t, []string{net.ParseIP("1.1.1.1").String(), net.ParseIP("2.2.2.2").String()}, event["a"], "could not get correct a record") require.ElementsMatch(t, []string{net.ParseIP("1.1.1.1").String(), net.ParseIP("2.2.2.2").String(), net.ParseIP("3.3.3.3").String()}, event["a"], "could not get correct a record")
} }
func TestDNSOperatorMatch(t *testing.T) { func TestDNSOperatorMatch(t *testing.T) {