Skip to content

Commit 01a88e8

Browse files
committed
Remove dot/dollar restrictions for insert/replace validation
This adds top-level key validation to _mongoc_validate_replace, similar to what existed in _mongoc_validate_update.
1 parent 924105d commit 01a88e8

File tree

1 file changed

+25
-4
lines changed

1 file changed

+25
-4
lines changed

src/libmongoc/src/mongoc/mongoc-util.c

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,11 @@
2828

2929
const bson_validate_flags_t _mongoc_default_insert_vflags =
3030
BSON_VALIDATE_UTF8 | BSON_VALIDATE_UTF8_ALLOW_NULL |
31-
BSON_VALIDATE_EMPTY_KEYS | BSON_VALIDATE_DOT_KEYS |
32-
BSON_VALIDATE_DOLLAR_KEYS;
31+
BSON_VALIDATE_EMPTY_KEYS;
3332

3433
const bson_validate_flags_t _mongoc_default_replace_vflags =
3534
BSON_VALIDATE_UTF8 | BSON_VALIDATE_UTF8_ALLOW_NULL |
36-
BSON_VALIDATE_EMPTY_KEYS | BSON_VALIDATE_DOT_KEYS |
37-
BSON_VALIDATE_DOLLAR_KEYS;
35+
BSON_VALIDATE_EMPTY_KEYS;
3836

3937
const bson_validate_flags_t _mongoc_default_update_vflags =
4038
BSON_VALIDATE_UTF8 | BSON_VALIDATE_UTF8_ALLOW_NULL |
@@ -324,6 +322,8 @@ _mongoc_validate_replace (const bson_t *doc,
324322
bson_error_t *error)
325323
{
326324
bson_error_t validate_err;
325+
bson_iter_t iter;
326+
const char *key;
327327

328328
if (vflags == BSON_VALIDATE_NONE) {
329329
return true;
@@ -338,6 +338,27 @@ _mongoc_validate_replace (const bson_t *doc,
338338
return false;
339339
}
340340

341+
if (!bson_iter_init (&iter, doc)) {
342+
bson_set_error (error,
343+
MONGOC_ERROR_BSON,
344+
MONGOC_ERROR_BSON_INVALID,
345+
"replace document is corrupt");
346+
return false;
347+
}
348+
349+
while (bson_iter_next (&iter)) {
350+
key = bson_iter_key (&iter);
351+
if (key[0] == '$') {
352+
bson_set_error (error,
353+
MONGOC_ERROR_COMMAND,
354+
MONGOC_ERROR_COMMAND_INVALID_ARG,
355+
"Invalid key '%s': replace prohibits $ operators",
356+
key);
357+
358+
return false;
359+
}
360+
}
361+
341362
return true;
342363
}
343364

0 commit comments

Comments
 (0)