From 9d32a09e30aec795ffb381f4fc3f827f780e662c Mon Sep 17 00:00:00 2001 From: Noah Stapp Date: Tue, 12 Dec 2023 13:00:14 -0800 Subject: [PATCH] PYTHON-4084 Fix BSON inflation for DBRef (#1458) --- bson/_cbsonmodule.c | 5 +++++ test/test_raw_bson.py | 10 +++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/bson/_cbsonmodule.c b/bson/_cbsonmodule.c index 7e691d8be..148d222f6 100644 --- a/bson/_cbsonmodule.c +++ b/bson/_cbsonmodule.c @@ -1884,6 +1884,11 @@ static PyObject* get_value(PyObject* self, PyObject* name, const char* buffer, goto invalid; } + if (options->is_raw_bson) { + *position += size; + break; + } + /* Hook for DBRefs */ value = _dbref_hook(self, value); if (!value) { diff --git a/test/test_raw_bson.py b/test/test_raw_bson.py index 105eab7d9..11bc80dd9 100644 --- a/test/test_raw_bson.py +++ b/test/test_raw_bson.py @@ -22,7 +22,7 @@ sys.path[0:0] = [""] from test import client_context, unittest from test.test_client import IntegrationTest -from bson import Code, decode, encode +from bson import Code, DBRef, decode, encode from bson.binary import JAVA_LEGACY, Binary, UuidRepresentation from bson.codec_options import CodecOptions from bson.errors import InvalidBSON @@ -205,6 +205,14 @@ class TestRawBSONDocument(IntegrationTest): self.assertEqual(decode(encode(doc)), {"value": Code("x=1", {})}) self.assertEqual(doc["value"].scope, RawBSONDocument(encode({}))) + def test_contains_dbref(self): + doc = RawBSONDocument(encode({"value": DBRef("test", "id")})) + raw = {"$ref": "test", "$id": "id"} + raw_encoded = encode(decode(encode(raw))) + + self.assertEqual(decode(encode(doc)), {"value": DBRef("test", "id")}) + self.assertEqual(doc["value"].raw, raw_encoded) + if __name__ == "__main__": unittest.main()