summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMathias Stearn <mathias@10gen.com>2013-04-18 14:41:28 -0400
committerMathias Stearn <redbeard0531@gmail.com>2013-04-18 19:02:58 -0400
commit716d31016dc572a87ffc7748d6d4f5348e1a28d6 (patch)
tree5c6e40f56b2046a56e55e17d9002f8ee00af6585
parent022affc651140b5ad28ff5a48b5e4564e1d97317 (diff)
downloadmongo-716d31016dc572a87ffc7748d6d4f5348e1a28d6.tar.gz
SERVER-9089 Check for NULL BSONHolder
-rw-r--r--src/mongo/scripting/engine_v8.cpp14
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;
}