diff --git a/builder/parser/parser.go b/builder/parser/parser.go index ad42a1586e..a0bb881f80 100644 --- a/builder/parser/parser.go +++ b/builder/parser/parser.go @@ -3,6 +3,7 @@ package parser import ( "bufio" + "fmt" "io" "regexp" "strings" @@ -32,7 +33,7 @@ type Node struct { var ( dispatch map[string]func(string) (*Node, map[string]bool, error) TOKEN_WHITESPACE = regexp.MustCompile(`[\t\v\f\r ]+`) - TOKEN_LINE_CONTINUATION = regexp.MustCompile(`\\\s*$`) + TOKEN_LINE_CONTINUATION = regexp.MustCompile(`\\[ \t]*$`) TOKEN_COMMENT = regexp.MustCompile(`^#.*$`) ) @@ -77,6 +78,10 @@ func parseLine(line string) (string, *Node, error) { return "", nil, err } + if len(args) == 0 { + return "", nil, fmt.Errorf("Instruction %q is empty; cannot continue", cmd) + } + node := &Node{} node.Value = cmd diff --git a/builder/parser/testfiles-negative/empty-instruction/Dockerfile b/builder/parser/testfiles-negative/empty-instruction/Dockerfile new file mode 100644 index 0000000000..74e625a402 --- /dev/null +++ b/builder/parser/testfiles-negative/empty-instruction/Dockerfile @@ -0,0 +1,8 @@ +FROM dockerfile/rabbitmq + +RUN + rabbitmq-plugins enable \ + rabbitmq_shovel \ + rabbitmq_shovel_management \ + rabbitmq_federation \ + rabbitmq_federation_management diff --git a/integration-cli/docker_cli_build_test.go b/integration-cli/docker_cli_build_test.go index 189b6a7ba1..980314d55c 100644 --- a/integration-cli/docker_cli_build_test.go +++ b/integration-cli/docker_cli_build_test.go @@ -22,6 +22,27 @@ import ( "github.com/docker/docker/pkg/archive" ) +func TestBuildEmptyWhitespace(t *testing.T) { + name := "testbuildemptywhitespace" + defer deleteImages(name) + + _, err := buildImage( + name, + ` + FROM busybox + RUN + quux \ + bar + `, + true) + + if err == nil { + t.Fatal("no error when dealing with a RUN statement with no content on the same line") + } + + logDone("build - statements with whitespace and no content should generate a parse error") +} + func TestBuildShCmdJSONEntrypoint(t *testing.T) { name := "testbuildshcmdjsonentrypoint" defer deleteImages(name)