Skip to content

Commit 9d32a09

Browse files
authored
PYTHON-4084 Fix BSON inflation for DBRef (#1458)
1 parent 568a3b1 commit 9d32a09

File tree

2 files changed

+14
-1
lines changed

2 files changed

+14
-1
lines changed

bson/_cbsonmodule.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1884,6 +1884,11 @@ static PyObject* get_value(PyObject* self, PyObject* name, const char* buffer,
18841884
goto invalid;
18851885
}
18861886

1887+
if (options->is_raw_bson) {
1888+
*position += size;
1889+
break;
1890+
}
1891+
18871892
/* Hook for DBRefs */
18881893
value = _dbref_hook(self, value);
18891894
if (!value) {

test/test_raw_bson.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
from test import client_context, unittest
2323
from test.test_client import IntegrationTest
2424

25-
from bson import Code, decode, encode
25+
from bson import Code, DBRef, decode, encode
2626
from bson.binary import JAVA_LEGACY, Binary, UuidRepresentation
2727
from bson.codec_options import CodecOptions
2828
from bson.errors import InvalidBSON
@@ -205,6 +205,14 @@ def test_contains_code_with_scope(self):
205205
self.assertEqual(decode(encode(doc)), {"value": Code("x=1", {})})
206206
self.assertEqual(doc["value"].scope, RawBSONDocument(encode({})))
207207

208+
def test_contains_dbref(self):
209+
doc = RawBSONDocument(encode({"value": DBRef("test", "id")}))
210+
raw = {"$ref": "test", "$id": "id"}
211+
raw_encoded = encode(decode(encode(raw)))
212+
213+
self.assertEqual(decode(encode(doc)), {"value": DBRef("test", "id")})
214+
self.assertEqual(doc["value"].raw, raw_encoded)
215+
208216

209217
if __name__ == "__main__":
210218
unittest.main()

0 commit comments

Comments
 (0)