From be6daa5fd46edc9f66a5129347482b38e22bf103 Mon Sep 17 00:00:00 2001 From: Francis Lavoie Date: Tue, 22 Sep 2020 19:37:15 -0400 Subject: [PATCH] httpcaddyfile: Fix panic when parsing route with matchers (#3746) Fixes #3745 --- caddyconfig/httpcaddyfile/directives.go | 6 +++- .../caddyfile_adapt/matchers_in_route.txt | 31 +++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 caddytest/integration/caddyfile_adapt/matchers_in_route.txt diff --git a/caddyconfig/httpcaddyfile/directives.go b/caddyconfig/httpcaddyfile/directives.go index e9ba44c8ed6..5d9a3391313 100644 --- a/caddyconfig/httpcaddyfile/directives.go +++ b/caddyconfig/httpcaddyfile/directives.go @@ -304,13 +304,17 @@ func parseSegmentAsConfig(h Helper) ([]ConfigValue, error) { } // find and extract any embedded matcher definitions in this scope - for i, seg := range segments { + for i := 0; i < len(segments); i++ { + seg := segments[i] if strings.HasPrefix(seg.Directive(), matcherPrefix) { + // parse, then add the matcher to matcherDefs err := parseMatcherDefinitions(caddyfile.NewDispenser(seg), matcherDefs) if err != nil { return nil, err } + // remove the matcher segment (consumed), then step back the loop segments = append(segments[:i], segments[i+1:]...) + i-- } } diff --git a/caddytest/integration/caddyfile_adapt/matchers_in_route.txt b/caddytest/integration/caddyfile_adapt/matchers_in_route.txt new file mode 100644 index 00000000000..01609b03ae3 --- /dev/null +++ b/caddytest/integration/caddyfile_adapt/matchers_in_route.txt @@ -0,0 +1,31 @@ +:80 { + route { + # unused matchers should not panic + # see https://github.com/caddyserver/caddy/issues/3745 + @matcher1 path /path1 + @matcher2 path /path2 + } +} +---------- +{ + "apps": { + "http": { + "servers": { + "srv0": { + "listen": [ + ":80" + ], + "routes": [ + { + "handle": [ + { + "handler": "subroute" + } + ] + } + ] + } + } + } + } +} \ No newline at end of file