Skip to content

Commit c0be473

Browse files
author
Divjot Arora
committed
GODRIVER-1513 Disallow escaped single quotes in extjson keys (#342)
1 parent 2bab134 commit c0be473

File tree

3 files changed

+35
-28
lines changed

3 files changed

+35
-28
lines changed

bson/bsonrw/json_scanner.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ func (js *jsonScanner) scanString() (*jsonToken, error) {
183183
case '\\':
184184
c, err = js.readNextByte()
185185
switch c {
186-
case '"', '\\', '/', '\'':
186+
case '"', '\\', '/':
187187
b.WriteByte(c)
188188
case 'b':
189189
b.WriteByte('\b')

bson/bsonrw/json_scanner_test.go

Lines changed: 32 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,8 @@ func TestJsonScannerValidInputs(t *testing.T) {
9797
},
9898
{
9999
desc: "valid string--escaped characters",
100-
input: `"\"\\\'\/\b\f\n\r\t"`,
101-
tokens: []jsonToken{{t: jttString, v: "\"\\'/\b\f\n\r\t"}},
100+
input: `"\"\\\/\b\f\n\r\t"`,
101+
tokens: []jsonToken{{t: jttString, v: "\"\\/\b\f\n\r\t"}},
102102
},
103103
{
104104
desc: "valid literal--true", input: "true",
@@ -275,32 +275,34 @@ func TestJsonScannerValidInputs(t *testing.T) {
275275
}
276276

277277
for _, tc := range cases {
278-
js := &jsonScanner{r: strings.NewReader(tc.input)}
278+
t.Run(tc.desc, func(t *testing.T) {
279+
js := &jsonScanner{r: strings.NewReader(tc.input)}
279280

280-
for _, token := range tc.tokens {
281-
c, err := js.nextToken()
282-
jttDiff(t, token.t, c.t, tc.desc)
283-
jtvDiff(t, token.v, c.v, tc.desc)
284-
expectNoError(t, err, tc.desc)
285-
}
281+
for _, token := range tc.tokens {
282+
c, err := js.nextToken()
283+
jttDiff(t, token.t, c.t, tc.desc)
284+
jtvDiff(t, token.v, c.v, tc.desc)
285+
expectNoError(t, err, tc.desc)
286+
}
286287

287-
c, err := js.nextToken()
288-
jttDiff(t, jttEOF, c.t, tc.desc)
289-
noerr(t, err)
288+
c, err := js.nextToken()
289+
jttDiff(t, jttEOF, c.t, tc.desc)
290+
noerr(t, err)
290291

291-
// testing early EOF reading
292-
js = &jsonScanner{r: iotest.DataErrReader(strings.NewReader(tc.input))}
292+
// testing early EOF reading
293+
js = &jsonScanner{r: iotest.DataErrReader(strings.NewReader(tc.input))}
293294

294-
for _, token := range tc.tokens {
295-
c, err := js.nextToken()
296-
jttDiff(t, token.t, c.t, tc.desc)
297-
jtvDiff(t, token.v, c.v, tc.desc)
298-
expectNoError(t, err, tc.desc)
299-
}
295+
for _, token := range tc.tokens {
296+
c, err := js.nextToken()
297+
jttDiff(t, token.t, c.t, tc.desc)
298+
jtvDiff(t, token.v, c.v, tc.desc)
299+
expectNoError(t, err, tc.desc)
300+
}
300301

301-
c, err = js.nextToken()
302-
jttDiff(t, jttEOF, c.t, tc.desc)
303-
noerr(t, err)
302+
c, err = js.nextToken()
303+
jttDiff(t, jttEOF, c.t, tc.desc)
304+
noerr(t, err)
305+
})
304306
}
305307
}
306308

@@ -309,6 +311,7 @@ func TestJsonScannerInvalidInputs(t *testing.T) {
309311
{desc: "missing quotation", input: `"missing`},
310312
{desc: "invalid escape character--first character", input: `"\invalid"`},
311313
{desc: "invalid escape character--middle", input: `"i\nv\alid"`},
314+
{desc: "invalid escape character--single quote", input: `"f\'oo"`},
312315
{desc: "invalid literal--trueee", input: "trueee"},
313316
{desc: "invalid literal--tire", input: "tire"},
314317
{desc: "invalid literal--nulll", input: "nulll"},
@@ -337,10 +340,12 @@ func TestJsonScannerInvalidInputs(t *testing.T) {
337340
}
338341

339342
for _, tc := range cases {
340-
js := &jsonScanner{r: strings.NewReader(tc.input)}
343+
t.Run(tc.desc, func(t *testing.T) {
344+
js := &jsonScanner{r: strings.NewReader(tc.input)}
341345

342-
c, err := js.nextToken()
343-
expectNilToken(t, c, tc.desc)
344-
expectError(t, err, tc.desc)
346+
c, err := js.nextToken()
347+
expectNilToken(t, c, tc.desc)
348+
expectError(t, err, tc.desc)
349+
})
345350
}
346351
}

bson/extjson_prose_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"fmt"
1111
"testing"
1212

13+
"go.mongodb.org/mongo-driver/bson/bsonrw"
1314
"go.mongodb.org/mongo-driver/internal/testutil/assert"
1415
)
1516

@@ -28,6 +29,7 @@ func TestExtJSON(t *testing.T) {
2829
{"timestamp - negative int64 value", `{"":{"$timestamp":{"t":0,"i":-2147483649}}}`, false, timestampNegativeInt64Err},
2930
{"timestamp - value overflows uint32", `{"":{"$timestamp":{"t":0,"i":4294967296}}}`, false, timestampLargeValueErr},
3031
{"top level key is not treated as special", `{"$code": "foo"}`, false, nil},
32+
{"escaped signle quote errors", `{"f\'oo": "bar"}`, false, bsonrw.ErrInvalidJSON},
3133
}
3234
for _, tc := range testCases {
3335
t.Run(tc.name, func(t *testing.T) {

0 commit comments

Comments
 (0)