Skip to content

Commit 22031f9

Browse files
author
Bezalel Brandwine
committed
support windows escaped windows paths in embedded json
1 parent 1398296 commit 22031f9

3 files changed

+38
-8
lines changed

decode_embedded_json_test.go

+12
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,18 @@ func TestDecodeEmbeddedJSONUnmarshalAPI(t *testing.T) {
4040
expectedEmbedded string
4141
err bool
4242
}{
43+
{
44+
name: "windows paths escaped",
45+
json: []byte(`{"id":"someid","method":"getmydata","params":"C:\\\\ProgramData\\\\MySQL\\\\MySQL Server 8.0\\\\Data\\\\#innodb_temp\\\\", "more":123}`),
46+
expectedEmbedded: `"C:\\\\ProgramData\\\\MySQL\\\\MySQL Server 8.0\\\\Data\\\\#innodb_temp\\\\"`,
47+
err: false,
48+
},
49+
{
50+
name: "windows paths escaped",
51+
json: []byte(`{"id":"someid","method":"getmydata","params":"C:\\\\ProgramData\\\\MySQL\\\\MySQL Server 8.0\\\\Data\\\\#innodb_temp\\\\jjjj", "more":123}`),
52+
expectedEmbedded: `"C:\\\\ProgramData\\\\MySQL\\\\MySQL Server 8.0\\\\Data\\\\#innodb_temp\\\\jjjj"`,
53+
err: false,
54+
},
4355
{
4456
name: "decode-basic-string",
4557
json: []byte(`{"id":"someid","method":"getmydata","params":"raw data", "more":123}`),

decode_string.go

+7-2
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ func (dec *Decoder) getString() (int, int, error) {
164164
return 0, 0, dec.raiseInvalidJSONErr(dec.cursor)
165165
}
166166

167+
// expecting the dec.cursor to be after the opening slash
167168
func (dec *Decoder) skipEscapedString() error {
168169
start := dec.cursor
169170
for ; dec.cursor < dec.length || dec.read(); dec.cursor++ {
@@ -173,9 +174,12 @@ func (dec *Decoder) skipEscapedString() error {
173174
nSlash := dec.cursor - start
174175
switch d {
175176
case '"':
176-
// nSlash must be odd
177+
// since we expecting the start to be after the opening slash
178+
// if nSlash is odd then the escaped string contains the quote
179+
// if nSlash is even, the quote is outside the escaped string
177180
if nSlash&1 != 1 {
178-
return dec.raiseInvalidJSONErr(dec.cursor)
181+
// return dec.raiseInvalidJSONErr(dec.cursor)
182+
dec.cursor--
179183
}
180184
return nil
181185
case 'u': // is unicode, we skip the following characters and place the cursor one one byte backward to avoid it breaking when returning to skipString
@@ -198,6 +202,7 @@ func (dec *Decoder) skipEscapedString() error {
198202
return dec.raiseInvalidJSONErr(dec.cursor)
199203
}
200204

205+
// expecting dec.cusror to be after the opening quote
201206
func (dec *Decoder) skipString() error {
202207
for dec.cursor < dec.length || dec.read() {
203208
switch dec.data[dec.cursor] {

decode_string_test.go

+19-6
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@ func TestDecoderString(t *testing.T) {
1717
err bool
1818
errType interface{}
1919
}{
20+
{
21+
name: "windows paths escaped",
22+
json: `"C:\\\\ProgramData\\\\MySQL\\\\MySQL Server 8.0\\\\Data\\\\#innodb_temp\\\\"`,
23+
expectedResult: `C:\\ProgramData\\MySQL\\MySQL Server 8.0\\Data\\#innodb_temp\\`,
24+
err: false,
25+
},
2026
{
2127
name: "basic-string",
2228
json: `"string"`,
@@ -328,6 +334,12 @@ func TestDecoderStringNull(t *testing.T) {
328334
errType interface{}
329335
resultIsNil bool
330336
}{
337+
{
338+
name: "windows paths escaped",
339+
json: `"C:\\\\ProgramData\\\\MySQL\\\\MySQL Server 8.0\\\\Data\\\\#innodb_temp\\\\"`,
340+
expectedResult: `C:\\ProgramData\\MySQL\\MySQL Server 8.0\\Data\\#innodb_temp\\`,
341+
err: false,
342+
},
331343
{
332344
name: "basic-string",
333345
json: `"string"`,
@@ -690,8 +702,9 @@ func TestDecoderSkipEscapedStringError2(t *testing.T) {
690702
dec := NewDecoder(strings.NewReader(`\"`))
691703
defer dec.Release()
692704
err := dec.skipEscapedString()
693-
assert.NotNil(t, err, "Err must be nil")
694-
assert.IsType(t, InvalidJSONError(""), err, "err must be of type InvalidJSONError")
705+
assert.Nil(t, err, "Err must be nil")
706+
// assert.IsType(t, InvalidJSONError(""), err, "err must be of type InvalidJSONError")
707+
assert.Equal(t, 1, dec.cursor, "dec.cursor must be 2")
695708
}
696709

697710
func TestDecoderSkipEscapedStringError3(t *testing.T) {
@@ -727,14 +740,14 @@ func TestSkipString(t *testing.T) {
727740
errType interface{}
728741
}{
729742
{
730-
name: "escape quote err",
743+
name: "escape quote err0",
731744
json: `test string \\" escaped"`,
732745
expectedResult: ``,
733-
err: true,
734-
errType: InvalidJSONError(""),
746+
err: false,
747+
// errType: InvalidJSONError(""),
735748
},
736749
{
737-
name: "escape quote err",
750+
name: "escape quote err1",
738751
json: `test string \\\l escaped"`,
739752
expectedResult: ``,
740753
err: true,

0 commit comments

Comments
 (0)