diff options
author | Mathias Stearn <mathias@10gen.com> | 2013-04-18 14:41:28 -0400 |
---|---|---|
committer | Mathias Stearn <redbeard0531@gmail.com> | 2013-04-18 19:02:58 -0400 |
commit | 716d31016dc572a87ffc7748d6d4f5348e1a28d6 (patch) | |
tree | 5c6e40f56b2046a56e55e17d9002f8ee00af6585 | |
parent | 022affc651140b5ad28ff5a48b5e4564e1d97317 (diff) | |
download | mongo-716d31016dc572a87ffc7748d6d4f5348e1a28d6.tar.gz |
SERVER-9089 Check for NULL BSONHolder
-rw-r--r-- | src/mongo/scripting/engine_v8.cpp | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/src/mongo/scripting/engine_v8.cpp b/src/mongo/scripting/engine_v8.cpp index c1e3648e528..487bec5996d 100644 --- a/src/mongo/scripting/engine_v8.cpp +++ b/src/mongo/scripting/engine_v8.cpp @@ -80,7 +80,7 @@ namespace mongo { string key = toSTLString(name); BSONHolder* holder = unwrapHolder(info.Holder()); - if (holder->_removed.count(key)) + if (!holder || holder->_removed.count(key)) return handle_scope.Close(v8::Handle<v8::Value>()); BSONObj obj = holder->_obj; @@ -100,7 +100,7 @@ namespace mongo { if (elmt.type() == mongo::Object || elmt.type() == mongo::Array) { // if accessing a subobject, it may get modified and base obj would not know // have to set base as modified, which means some optim is lost - unwrapHolder(info.Holder())->_modified = true; + holder->_modified = true; } } catch (const DBException &dbEx) { @@ -143,6 +143,7 @@ namespace mongo { const v8::AccessorInfo& info) { string key = toSTLString(name); BSONHolder* holder = unwrapHolder(info.Holder()); + if (!holder) return v8::Handle<v8::Value>(); holder->_removed.erase(key); holder->_modified = true; @@ -154,6 +155,7 @@ namespace mongo { static v8::Handle<v8::Array> namedEnumerator(const v8::AccessorInfo &info) { v8::HandleScope handle_scope; BSONHolder* holder = unwrapHolder(info.Holder()); + if (!holder) return v8::Handle<v8::Array>(); BSONObj obj = holder->_obj; v8::Handle<v8::Array> out = v8::Array::New(); int outIndex = 0; @@ -191,6 +193,7 @@ namespace mongo { v8::HandleScope handle_scope; string key = toSTLString(name); BSONHolder* holder = unwrapHolder(info.Holder()); + if (!holder) return v8::Handle<v8::Boolean>(); holder->_removed.insert(key); holder->_modified = true; @@ -213,6 +216,7 @@ namespace mongo { V8Scope* scope = (V8Scope*)(scp->Value()); BSONHolder* holder = unwrapHolder(info.Holder()); + if (!holder) return v8::Handle<v8::Value>(); if (holder->_removed.count(key)) return handle_scope.Close(v8::Handle<v8::Value>()); @@ -226,7 +230,7 @@ namespace mongo { if (elmt.type() == mongo::Object || elmt.type() == mongo::Array) { // if accessing a subobject, it may get modified and base obj would not know // have to set base as modified, which means some optim is lost - unwrapHolder(info.Holder())->_modified = true; + holder->_modified = true; } } catch (const DBException &dbEx) { @@ -242,6 +246,7 @@ namespace mongo { v8::Handle<v8::Boolean> indexedDelete(uint32_t index, const v8::AccessorInfo& info) { string key = str::stream() << index; BSONHolder* holder = unwrapHolder(info.Holder()); + if (!holder) return v8::Handle<v8::Boolean>(); holder->_removed.insert(key); holder->_modified = true; @@ -285,6 +290,7 @@ namespace mongo { const v8::AccessorInfo& info) { string key = str::stream() << index; BSONHolder* holder = unwrapHolder(info.Holder()); + if (!holder) return v8::Handle<v8::Value>(); holder->_removed.erase(key); holder->_modified = true; @@ -1648,7 +1654,7 @@ namespace mongo { if (o->Has(v8::String::New("_bson"))) { originalBSON = unwrapBSONObj(o); BSONHolder* holder = unwrapHolder(o); - if (!holder->_modified) { + if (holder && !holder->_modified) { // object was not modified, use bson as is return originalBSON; } |