From 21b15ac920d5e51f636d7febf07a4a52f5e61bff Mon Sep 17 00:00:00 2001 From: Erik Hollensbe Date: Fri, 8 Aug 2014 13:44:57 -0700 Subject: [PATCH] builder: handle certain classes of JSON errors gracefully Docker-DCO-1.1-Signed-off-by: Erik Hollensbe (github: erikh) --- builder/parser/line_parsers.go | 6 ++++-- builder/parser/parser_test.go | 2 +- .../Dockerfile | 1 + .../jeztah-invalid-json-json-inside-string-double/result | 1 + .../jeztah-invalid-json-json-inside-string/Dockerfile | 1 + .../testfiles/jeztah-invalid-json-json-inside-string/result | 1 + .../testfiles/jeztah-invalid-json-single-quotes/Dockerfile | 1 + .../testfiles/jeztah-invalid-json-single-quotes/result | 1 + .../jeztah-invalid-json-unterminated-bracket/Dockerfile | 1 + .../jeztah-invalid-json-unterminated-bracket/result | 1 + .../jeztah-invalid-json-unterminated-string/Dockerfile | 1 + .../jeztah-invalid-json-unterminated-string/result | 1 + 12 files changed, 15 insertions(+), 3 deletions(-) create mode 100644 builder/parser/testfiles/jeztah-invalid-json-json-inside-string-double/Dockerfile create mode 100644 builder/parser/testfiles/jeztah-invalid-json-json-inside-string-double/result create mode 100644 builder/parser/testfiles/jeztah-invalid-json-json-inside-string/Dockerfile create mode 100644 builder/parser/testfiles/jeztah-invalid-json-json-inside-string/result create mode 100644 builder/parser/testfiles/jeztah-invalid-json-single-quotes/Dockerfile create mode 100644 builder/parser/testfiles/jeztah-invalid-json-single-quotes/result create mode 100644 builder/parser/testfiles/jeztah-invalid-json-unterminated-bracket/Dockerfile create mode 100644 builder/parser/testfiles/jeztah-invalid-json-unterminated-bracket/result create mode 100644 builder/parser/testfiles/jeztah-invalid-json-unterminated-string/Dockerfile create mode 100644 builder/parser/testfiles/jeztah-invalid-json-unterminated-string/result diff --git a/builder/parser/line_parsers.go b/builder/parser/line_parsers.go index ec748106fc..1e460697ca 100644 --- a/builder/parser/line_parsers.go +++ b/builder/parser/line_parsers.go @@ -91,10 +91,11 @@ func parseJSON(rest string) (*Node, error) { for _, str := range myJson { switch str.(type) { - case []interface{}: - return nil, dockerFileErrJSONNesting + case string: case float64: str = strconv.FormatFloat(str.(float64), 'G', -1, 64) + default: + return nil, dockerFileErrJSONNesting } next.Value = str.(string) next.Next = blankNode() @@ -115,6 +116,7 @@ func parseMaybeJSON(rest string) (*Node, error) { if strings.HasPrefix(rest, "[") { node, err := parseJSON(rest) + if err == nil { return node, nil } else if err == dockerFileErrJSONNesting { diff --git a/builder/parser/parser_test.go b/builder/parser/parser_test.go index 3969b01fca..871da477c1 100644 --- a/builder/parser/parser_test.go +++ b/builder/parser/parser_test.go @@ -37,7 +37,7 @@ func TestTestNegative(t *testing.T) { _, err = Parse(df) if err == nil { - t.Fatalf("No error parsing broken dockerfile for %s: %s", dir.Name(), err.Error()) + t.Fatalf("No error parsing broken dockerfile for %s", dir.Name()) } df.Close() diff --git a/builder/parser/testfiles/jeztah-invalid-json-json-inside-string-double/Dockerfile b/builder/parser/testfiles/jeztah-invalid-json-json-inside-string-double/Dockerfile new file mode 100644 index 0000000000..39fe27d99c --- /dev/null +++ b/builder/parser/testfiles/jeztah-invalid-json-json-inside-string-double/Dockerfile @@ -0,0 +1 @@ +CMD "[\"echo\", \"Phew, I just managed to escaped those double quotes\"]" diff --git a/builder/parser/testfiles/jeztah-invalid-json-json-inside-string-double/result b/builder/parser/testfiles/jeztah-invalid-json-json-inside-string-double/result new file mode 100644 index 0000000000..bfd84ae489 --- /dev/null +++ b/builder/parser/testfiles/jeztah-invalid-json-json-inside-string-double/result @@ -0,0 +1 @@ +(cmd "\"[\\\"echo\\\", \\\"Phew, I just managed to escaped those double quotes\\\"]\"") \ No newline at end of file diff --git a/builder/parser/testfiles/jeztah-invalid-json-json-inside-string/Dockerfile b/builder/parser/testfiles/jeztah-invalid-json-json-inside-string/Dockerfile new file mode 100644 index 0000000000..eaae081a06 --- /dev/null +++ b/builder/parser/testfiles/jeztah-invalid-json-json-inside-string/Dockerfile @@ -0,0 +1 @@ +CMD '["echo", "Well, JSON in a string is JSON too?"]' diff --git a/builder/parser/testfiles/jeztah-invalid-json-json-inside-string/result b/builder/parser/testfiles/jeztah-invalid-json-json-inside-string/result new file mode 100644 index 0000000000..f8f7b5017b --- /dev/null +++ b/builder/parser/testfiles/jeztah-invalid-json-json-inside-string/result @@ -0,0 +1 @@ +(cmd "'[\"echo\", \"Well, JSON in a string is JSON too?\"]'") \ No newline at end of file diff --git a/builder/parser/testfiles/jeztah-invalid-json-single-quotes/Dockerfile b/builder/parser/testfiles/jeztah-invalid-json-single-quotes/Dockerfile new file mode 100644 index 0000000000..c3ac63c07a --- /dev/null +++ b/builder/parser/testfiles/jeztah-invalid-json-single-quotes/Dockerfile @@ -0,0 +1 @@ +CMD ['echo','single quotes are invalid JSON'] diff --git a/builder/parser/testfiles/jeztah-invalid-json-single-quotes/result b/builder/parser/testfiles/jeztah-invalid-json-single-quotes/result new file mode 100644 index 0000000000..0623f8bf45 --- /dev/null +++ b/builder/parser/testfiles/jeztah-invalid-json-single-quotes/result @@ -0,0 +1 @@ +(cmd "['echo','single quotes are invalid JSON']") \ No newline at end of file diff --git a/builder/parser/testfiles/jeztah-invalid-json-unterminated-bracket/Dockerfile b/builder/parser/testfiles/jeztah-invalid-json-unterminated-bracket/Dockerfile new file mode 100644 index 0000000000..5fd4afa522 --- /dev/null +++ b/builder/parser/testfiles/jeztah-invalid-json-unterminated-bracket/Dockerfile @@ -0,0 +1 @@ +CMD ["echo", "Please, close the brackets when you're done" diff --git a/builder/parser/testfiles/jeztah-invalid-json-unterminated-bracket/result b/builder/parser/testfiles/jeztah-invalid-json-unterminated-bracket/result new file mode 100644 index 0000000000..d621ddcff3 --- /dev/null +++ b/builder/parser/testfiles/jeztah-invalid-json-unterminated-bracket/result @@ -0,0 +1 @@ +(cmd "[\"echo\", \"Please, close the brackets when you're done\"") \ No newline at end of file diff --git a/builder/parser/testfiles/jeztah-invalid-json-unterminated-string/Dockerfile b/builder/parser/testfiles/jeztah-invalid-json-unterminated-string/Dockerfile new file mode 100644 index 0000000000..30cc4bb48f --- /dev/null +++ b/builder/parser/testfiles/jeztah-invalid-json-unterminated-string/Dockerfile @@ -0,0 +1 @@ +CMD ["echo", "look ma, no quote!] diff --git a/builder/parser/testfiles/jeztah-invalid-json-unterminated-string/result b/builder/parser/testfiles/jeztah-invalid-json-unterminated-string/result new file mode 100644 index 0000000000..acedd80c45 --- /dev/null +++ b/builder/parser/testfiles/jeztah-invalid-json-unterminated-string/result @@ -0,0 +1 @@ +(cmd "[\"echo\", \"look ma, no quote!]") \ No newline at end of file