From 073bd8926224a9a4cc7c7fc90fdd3828046c381b Mon Sep 17 00:00:00 2001 From: Aaron Lehmann Date: Mon, 2 Nov 2015 09:12:21 -0800 Subject: [PATCH] Check length of input in WithName There is a constraint on the length of the name in a reference, so WithName should be checking this instead of potentially creating a reference that doesn't comply with the rules. Signed-off-by: Aaron Lehmann --- reference/reference.go | 3 +++ reference/reference_test.go | 45 +++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/reference/reference.go b/reference/reference.go index 48b910e44..3a5d36c2d 100644 --- a/reference/reference.go +++ b/reference/reference.go @@ -204,6 +204,9 @@ func ParseNamed(s string) (Named, error) { // WithName returns a named object representing the given string. If the input // is invalid ErrReferenceInvalidFormat will be returned. func WithName(name string) (Named, error) { + if len(name) > NameTotalLengthMax { + return nil, ErrNameTooLong + } if !anchoredNameRegexp.MatchString(name) { return nil, ErrReferenceInvalidFormat } diff --git a/reference/reference_test.go b/reference/reference_test.go index 2096fdaa4..8e1ac1f36 100644 --- a/reference/reference_test.go +++ b/reference/reference_test.go @@ -210,6 +210,51 @@ func TestReferenceParse(t *testing.T) { } } +// TestWithNameFailure tests cases where WithName should fail. Cases where it +// should succeed are covered by TestSplitHostname, below. +func TestWithNameFailure(t *testing.T) { + testcases := []struct { + input string + err error + }{ + { + input: "", + err: ErrNameEmpty, + }, + { + input: ":justtag", + err: ErrReferenceInvalidFormat, + }, + { + input: "@sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + err: ErrReferenceInvalidFormat, + }, + { + input: "validname@invaliddigest:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + err: ErrReferenceInvalidFormat, + }, + { + input: strings.Repeat("a/", 128) + "a:tag", + err: ErrNameTooLong, + }, + { + input: "aa/asdf$$^/aa", + err: ErrReferenceInvalidFormat, + }, + } + for _, testcase := range testcases { + failf := func(format string, v ...interface{}) { + t.Logf(strconv.Quote(testcase.input)+": "+format, v...) + t.Fail() + } + + _, err := WithName(testcase.input) + if err == nil { + failf("no error parsing name. expected: %s", testcase.err) + } + } +} + func TestSplitHostname(t *testing.T) { testcases := []struct { input string