diff --git a/rhel/dockerfile/dockerfile.go b/rhel/dockerfile/dockerfile.go index d450dc9ca..f47762ea8 100644 --- a/rhel/dockerfile/dockerfile.go +++ b/rhel/dockerfile/dockerfile.go @@ -95,12 +95,15 @@ func (p *labelParser) Run() error { return err } for _, kv := range pairs { - i := strings.IndexByte(kv, '=') - k, _, err := transform.String(p.unquote, kv[:i]) + idx := strings.IndexByte(kv, '=') + if idx == -1 { + return fmt.Errorf(`invalid syntax: %+#q`, i.val) + } + k, _, err := transform.String(p.unquote, kv[:idx]) if err != nil { return err } - v, _, err := transform.String(transform.Chain(p.unquote, p.vars), kv[i+1:]) + v, _, err := transform.String(transform.Chain(p.unquote, p.vars), kv[idx+1:]) if err != nil { return err } @@ -127,12 +130,15 @@ func (p *labelParser) Run() error { return err } for _, kv := range pairs { - i := strings.IndexByte(kv, '=') - k, _, err := transform.String(p.unquote, kv[:i]) + idx := strings.IndexByte(kv, '=') + if idx == -1 { + return fmt.Errorf(`invalid syntax: %+#q`, i.val) + } + k, _, err := transform.String(p.unquote, kv[:idx]) if err != nil { return err } - v, _, err := transform.String(transform.Chain(p.unquote, p.vars), kv[i+1:]) + v, _, err := transform.String(transform.Chain(p.unquote, p.vars), kv[idx+1:]) if err != nil { return err } diff --git a/rhel/dockerfile/itemkind_string.go b/rhel/dockerfile/itemkind_string.go new file mode 100644 index 000000000..bbdaa236a --- /dev/null +++ b/rhel/dockerfile/itemkind_string.go @@ -0,0 +1,29 @@ +// Code generated by "stringer -type itemKind lex.go"; DO NOT EDIT. + +package dockerfile + +import "strconv" + +func _() { + // An "invalid array index" compiler error signifies that the constant values have changed. + // Re-run the stringer command to generate them again. + var x [1]struct{} + _ = x[itemError-0] + _ = x[itemComment-1] + _ = x[itemInstruction-2] + _ = x[itemLabel-3] + _ = x[itemArg-4] + _ = x[itemEnv-5] + _ = x[itemEOF-6] +} + +const _itemKind_name = "itemErroritemCommentitemInstructionitemLabelitemArgitemEnvitemEOF" + +var _itemKind_index = [...]uint8{0, 9, 20, 35, 44, 51, 58, 65} + +func (i itemKind) String() string { + if i < 0 || i >= itemKind(len(_itemKind_index)-1) { + return "itemKind(" + strconv.FormatInt(int64(i), 10) + ")" + } + return _itemKind_name[_itemKind_index[i]:_itemKind_index[i+1]] +} diff --git a/rhel/dockerfile/lex.go b/rhel/dockerfile/lex.go index 2aa41fbf3..b28ff1e94 100644 --- a/rhel/dockerfile/lex.go +++ b/rhel/dockerfile/lex.go @@ -58,6 +58,8 @@ type item struct { type itemKind int +//go:generate stringer -type itemKind $GOFILE + const ( itemError itemKind = iota itemComment @@ -118,13 +120,18 @@ func (l *lexer) consumeWhitespace() (err error) { func (l *lexer) collectLine() (err error) { var r rune var sz int - var esc bool + var esc, inComment, started bool Read: for r, sz, err = l.rd.ReadRune(); err == nil; r, sz, err = l.rd.ReadRune() { switch { + case inComment && r == '\n': + inComment = false + started = false + case inComment: // Skip case esc && r == '\r': // Lexer hack: why do some things have DOS line endings? case esc && r == '\n': esc = false + started = false case esc: // This little lexer only cares about constructing the lines // correctly, so everything else gets passed through. @@ -134,9 +141,17 @@ Read: _, err = l.sb.WriteRune(r) case r == l.escchar: esc = true + started = true case !esc && r == '\n': err = l.rd.UnreadRune() break Read + case !started && !esc && r == '#': + inComment = true + case !started: + if !unicode.IsSpace(r) { + started = true + } + fallthrough default: _, err = l.sb.WriteRune(r) } diff --git a/rhel/dockerfile/testdata/Dockerfile-Comments b/rhel/dockerfile/testdata/Dockerfile-Comments new file mode 100644 index 000000000..c49db4575 --- /dev/null +++ b/rhel/dockerfile/testdata/Dockerfile-Comments @@ -0,0 +1,9 @@ +# Normal comments are fine +FROM scratch + +LABEL \ + # This style of comment is buck wild, but allowed. + A=B \ + C=D + # This comment is stripped despite the apparent continuation + diff --git a/rhel/dockerfile/testdata/Dockerfile-Comments.want b/rhel/dockerfile/testdata/Dockerfile-Comments.want new file mode 100644 index 000000000..6a87d4ec9 --- /dev/null +++ b/rhel/dockerfile/testdata/Dockerfile-Comments.want @@ -0,0 +1,4 @@ +{ + "A": "B", + "C": "D" +} diff --git a/rhel/dockerfile/testdata/Dockerfile-InvalidLabel b/rhel/dockerfile/testdata/Dockerfile-InvalidLabel new file mode 100644 index 000000000..aac0f91bf --- /dev/null +++ b/rhel/dockerfile/testdata/Dockerfile-InvalidLabel @@ -0,0 +1,2 @@ +LABEL A=B \ + C=D # Comments not allowed in this position diff --git a/rhel/dockerfile/testdata/Dockerfile-InvalidLabel.want b/rhel/dockerfile/testdata/Dockerfile-InvalidLabel.want new file mode 100644 index 000000000..6a87d4ec9 --- /dev/null +++ b/rhel/dockerfile/testdata/Dockerfile-InvalidLabel.want @@ -0,0 +1,4 @@ +{ + "A": "B", + "C": "D" +} diff --git a/rhel/dockerfile/testdata/Dockerfile-InvalidLabel.want.err b/rhel/dockerfile/testdata/Dockerfile-InvalidLabel.want.err new file mode 100644 index 000000000..d78ba18ad --- /dev/null +++ b/rhel/dockerfile/testdata/Dockerfile-InvalidLabel.want.err @@ -0,0 +1 @@ +invalid syntax: `A=B C=D # Comments not allowed in this position`