diff --git a/language/parse.go b/language/parse.go index 59b04100..b982d9e4 100644 --- a/language/parse.go +++ b/language/parse.go @@ -147,6 +147,7 @@ func update(b *language.Builder, part ...interface{}) (err error) { } var errInvalidWeight = errors.New("ParseAcceptLanguage: invalid weight") +var errTagListTooLarge = errors.New("tag list exceeds max length") // ParseAcceptLanguage parses the contents of an Accept-Language header as // defined in http://www.ietf.org/rfc/rfc2616.txt and returns a list of Tags and @@ -164,6 +165,10 @@ func ParseAcceptLanguage(s string) (tag []Tag, q []float32, err error) { } }() + if strings.Count(s, "-") > 1000 { + return nil, nil, errTagListTooLarge + } + var entry string for s != "" { if entry, s = split(s, ','); entry == "" { diff --git a/language/parse_test.go b/language/parse_test.go index e1e5653a..0eee033e 100644 --- a/language/parse_test.go +++ b/language/parse_test.go @@ -394,3 +394,16 @@ func TestParseAcceptLanguage(t *testing.T) { } } } + +func TestParseAcceptLanguageTooBig(t *testing.T) { + s := strings.Repeat("en-x-a-", 333) + _, _, err := ParseAcceptLanguage(s) + if err != language.ErrSyntax { + t.Errorf("ParseAcceptLanguage() unexpected error: got %v, want %v", err, language.ErrSyntax) + } + s += "en-x-a" + _, _, err = ParseAcceptLanguage(s) + if err != errTagListTooLarge { + t.Errorf("ParseAcceptLanguage() unexpected error: got %v, want %v", err, errTagListTooLarge) + } +}