summaryrefslogtreecommitdiff
path: root/src/mongo/scripting/mozjs/db.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/scripting/mozjs/db.cpp')
-rw-r--r--src/mongo/scripting/mozjs/db.cpp53
1 files changed, 25 insertions, 28 deletions
diff --git a/src/mongo/scripting/mozjs/db.cpp b/src/mongo/scripting/mozjs/db.cpp
index 7fa2f179241..7aa73337237 100644
--- a/src/mongo/scripting/mozjs/db.cpp
+++ b/src/mongo/scripting/mozjs/db.cpp
@@ -45,38 +45,17 @@ namespace mozjs {
const char* const DBInfo::className = "DB";
-void DBInfo::getProperty(JSContext* cx,
- JS::HandleObject obj,
- JS::HandleId id,
- JS::MutableHandleValue vp) {
- // 2nd look into real values, may be cached collection object
- if (!vp.isUndefined()) {
- auto scope = getScope(cx);
- auto opContext = scope->getOpContext();
-
- if (opContext && vp.isObject()) {
- ObjectWrapper o(cx, vp);
-
- if (o.hasOwnField(InternedString::_fullName)) {
- // need to check every time that the collection did not get sharded
- if (haveLocalShardingInfo(opContext, o.getString(InternedString::_fullName)))
- uasserted(ErrorCodes::BadValue, "can't use sharded collection from db.eval");
- }
- }
+void DBInfo::resolve(JSContext* cx, JS::HandleObject obj, JS::HandleId id, bool* resolvedp) {
+ *resolvedp = false;
- return;
- }
+ JS::RootedValue coll(cx);
JS::RootedObject parent(cx);
if (!JS_GetPrototype(cx, obj, &parent))
uasserted(ErrorCodes::JSInterpreterFailure, "Couldn't get prototype");
ObjectWrapper parentWrapper(cx, parent);
-
- if (parentWrapper.hasOwnField(id)) {
- parentWrapper.getValue(id, vp);
- return;
- }
+ ObjectWrapper o(cx, obj);
IdWrapper idw(cx, id);
@@ -87,21 +66,39 @@ void DBInfo::getProperty(JSContext* cx,
if (sname.size() == 0 || sname[0] == '_') {
return;
}
+
+ // SpiderMonkey will call resolve even for __proto__ so acknowledge it exists.
+ if (sname == "__proto__"_sd) {
+ *resolvedp = true;
+ return;
+ }
+ }
+
+ // Check if this exists on the parent, ie. DBCollection::resolve case
+ if (parentWrapper.hasOwnField(id)) {
+ parentWrapper.getValue(id, &coll);
+
+ o.defineProperty(id, coll, 0);
+
+ *resolvedp = true;
+ return;
}
// no hit, create new collection
JS::RootedValue getCollection(cx);
parentWrapper.getValue(InternedString::getCollection, &getCollection);
+ // Check if getCollection has been installed yet
+ // It is undefined if the user has a db name the same as one of methods/properties of the DB
+ // object.
if (!(getCollection.isObject() && JS_ObjectIsFunction(cx, getCollection.toObjectOrNull()))) {
- uasserted(ErrorCodes::BadValue, "getCollection is not a function");
+ return;
}
JS::AutoValueArray<1> args(cx);
idw.toValue(args[0]);
- JS::RootedValue coll(cx);
ObjectWrapper(cx, obj).callMethod(getCollection, args, &coll);
uassert(16861,
@@ -111,7 +108,7 @@ void DBInfo::getProperty(JSContext* cx,
// cache collection for reuse, don't enumerate
ObjectWrapper(cx, obj).defineProperty(id, coll, 0);
- vp.set(coll);
+ *resolvedp = true;
}
void DBInfo::construct(JSContext* cx, JS::CallArgs args) {