From e10e51a00827b9fdc1bee51439fef05afc529831 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Mon, 3 Jul 2017 09:00:17 +0200 Subject: parser: Fix handling of JSON front matter with escaped quotes Fixes #3661 --- parser/page.go | 9 ++++++++- parser/parse_frontmatter_test.go | 7 ++++++- 2 files changed, 14 insertions(+), 2 deletions(-) (limited to 'parser') diff --git a/parser/page.go b/parser/page.go index bacc9754b..9d633e29d 100644 --- a/parser/page.go +++ b/parser/page.go @@ -305,6 +305,7 @@ func extractFrontMatterDelims(r *bufio.Reader, left, right []byte) (fm []byte, e level int sameDelim = bytes.Equal(left, right) inQuote bool + escaped bool ) // Frontmatter must start with a delimiter. To check it first, // pre-reads beginning delimiter length - 1 bytes from Reader @@ -333,7 +334,12 @@ func extractFrontMatterDelims(r *bufio.Reader, left, right []byte) (fm []byte, e switch c { case '"': - inQuote = !inQuote + if !escaped { + inQuote = !inQuote + } + escaped = false + case '\\': + escaped = true case left[len(left)-1]: if sameDelim { // YAML, TOML case if bytes.HasSuffix(buf.Bytes(), left) && (buf.Len() == len(left) || buf.Bytes()[buf.Len()-len(left)-1] == '\n') { @@ -396,6 +402,7 @@ func extractFrontMatterDelims(r *bufio.Reader, left, right []byte) (fm []byte, e return buf.Bytes(), nil } + } } diff --git a/parser/parse_frontmatter_test.go b/parser/parse_frontmatter_test.go index 08a1cc42c..e2722f788 100644 --- a/parser/parse_frontmatter_test.go +++ b/parser/parse_frontmatter_test.go @@ -299,6 +299,11 @@ func TestExtractFrontMatterDelim(t *testing.T) { // Issue #3511 {`{ "title": "{" }`, `{ "title": "{" }`, noErrExpected}, {`{ "title": "{}" }`, `{ "title": "{}" }`, noErrExpected}, + // Issue #3661 + {`{ "title": "\"" }`, `{ "title": "\"" }`, noErrExpected}, + {`{ "title": "\"{", "other": "\"{}" }`, `{ "title": "\"{", "other": "\"{}" }`, noErrExpected}, + {`{ "title": "\"Foo\"" }`, `{ "title": "\"Foo\"" }`, noErrExpected}, + {`{ "title": "\"Foo\"\"" }`, `{ "title": "\"Foo\"\"" }`, noErrExpected}, } for i, test := range tests { @@ -310,7 +315,7 @@ func TestExtractFrontMatterDelim(t *testing.T) { } if !bytes.Equal(fm, []byte(test.extracted)) { t.Logf("\n%q\n", string(test.frontmatter)) - t.Errorf("[%d] Frontmatter did not match:\nexp: %q\ngot: %q", i, string(test.extracted), fm) + t.Errorf("[%d] Frontmatter did not match:\nexp: %q\ngot: %q", i, string(test.extracted), fm) } } } -- cgit v1.2.3