diff --git a/components/engine/builder/dockerfile/parser/parser.go b/components/engine/builder/dockerfile/parser/parser.go index 822c42b41a..a4bce1cca6 100644 --- a/components/engine/builder/dockerfile/parser/parser.go +++ b/components/engine/builder/dockerfile/parser/parser.go @@ -321,7 +321,7 @@ func Parse(rwc io.Reader) (*Result, error) { Warnings: warnings, EscapeToken: d.escapeToken, OS: d.platformToken, - }, nil + }, handleScannerError(scanner.Err()) } func trimComments(src []byte) []byte { @@ -358,3 +358,12 @@ func processLine(d *Directive, token []byte, stripLeftWhitespace bool) ([]byte, } return trimComments(token), d.possibleParserDirective(string(token)) } + +func handleScannerError(err error) error { + switch err { + case bufio.ErrTooLong: + return errors.Errorf("dockerfile line greater than max allowed size of %d", bufio.MaxScanTokenSize-1) + default: + return err + } +} diff --git a/components/engine/builder/dockerfile/parser/parser_test.go b/components/engine/builder/dockerfile/parser/parser_test.go index 5f354bb139..7bfbee92e4 100644 --- a/components/engine/builder/dockerfile/parser/parser_test.go +++ b/components/engine/builder/dockerfile/parser/parser_test.go @@ -1,12 +1,14 @@ package parser import ( + "bufio" "bytes" "fmt" "io/ioutil" "os" "path/filepath" "runtime" + "strings" "testing" "github.com/stretchr/testify/assert" @@ -159,3 +161,14 @@ RUN indented \ assert.Contains(t, warnings[1], "RUN another thing") assert.Contains(t, warnings[2], "will become errors in a future release") } + +func TestParseReturnsScannerErrors(t *testing.T) { + label := strings.Repeat("a", bufio.MaxScanTokenSize) + + dockerfile := strings.NewReader(fmt.Sprintf(` + FROM image + LABEL test=%s +`, label)) + _, err := Parse(dockerfile) + assert.EqualError(t, err, "dockerfile line greater than max allowed size of 65535") +}