diff --git a/types/model/name.go b/types/model/name.go index 9c56c49a..75bf2a89 100644 --- a/types/model/name.go +++ b/types/model/name.go @@ -156,7 +156,7 @@ func ParseName(s, fill string) Name { r = Name{} return false } - if kind == PartExtraneous || !isValidPart(kind, part) { + if kind == PartExtraneous || !IsValidNamePart(kind, part) { r = Name{} return false } @@ -176,7 +176,7 @@ func parseMask(s string) Name { // mask part; treat as empty but valid return true } - if !isValidPart(kind, part) { + if !IsValidNamePart(kind, part) { panic(fmt.Errorf("invalid mask part %s: %q", kind, part)) } r.parts[kind] = part @@ -608,7 +608,7 @@ func ParseNameFromFilepath(s, fill string) Name { var r Name for i := range PartBuild + 1 { part, rest, _ := strings.Cut(s, string(filepath.Separator)) - if !isValidPart(i, part) { + if !IsValidNamePart(i, part) { return Name{} } r.parts[i] = part @@ -654,9 +654,12 @@ func (r Name) FilepathNoBuild() string { return filepath.Join(r.parts[:PartBuild]...) } -// isValidPart reports if s contains all valid characters for the given -// part kind. -func isValidPart(kind PartKind, s string) bool { +// IsValidNamePart reports if s contains all valid characters for the given +// part kind and is under MaxNamePartLen bytes. +func IsValidNamePart(kind PartKind, s string) bool { + if len(s) > MaxNamePartLen { + return false + } if s == "" { return false } diff --git a/types/model/name_test.go b/types/model/name_test.go index 8749477a..d906eaf8 100644 --- a/types/model/name_test.go +++ b/types/model/name_test.go @@ -105,6 +105,12 @@ var testNames = map[string]fields{ strings.Repeat("a", MaxNamePartLen+1): {}, } +func TestIsValidNameLen(t *testing.T) { + if IsValidNamePart(PartNamespace, strings.Repeat("a", MaxNamePartLen+1)) { + t.Errorf("unexpectedly valid long name") + } +} + // TestConsecutiveDots tests that consecutive dots are not allowed in any // part, to avoid path traversal. There also are some tests in testNames, but // this test is more exhaustive and exists to emphasize the importance of