From a2249c005f0721df678eec9b3a2d1dec29e5971d Mon Sep 17 00:00:00 2001 From: Spencer Jackson Date: Mon, 23 Mar 2015 11:03:47 -0400 Subject: SERVER-17647 Compute BinData length --- src/mongo/scripting/engine_v8.cpp | 6 +++--- src/mongo/scripting/v8_db.cpp | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/mongo/scripting/engine_v8.cpp b/src/mongo/scripting/engine_v8.cpp index 4512ea02bac..1ad61ae9907 100644 --- a/src/mongo/scripting/engine_v8.cpp +++ b/src/mongo/scripting/engine_v8.cpp @@ -1514,11 +1514,11 @@ namespace mongo { verify(BinDataFT()->HasInstance(obj)); verify(obj->InternalFieldCount() == 1); - int len = obj->Get(strLitToV8("len"))->ToInt32()->Value(); + std::string binData(base64::decode(toSTLString(obj->GetInternalField(0)))); b.appendBinData(elementName, - len, + binData.size(), mongo::BinDataType(obj->Get(strLitToV8("type"))->ToInt32()->Value()), - base64::decode(toSTLString(obj->GetInternalField(0))).c_str()); + binData.c_str()); } OID V8Scope::v8ToMongoObjectID(v8::Handle obj) { diff --git a/src/mongo/scripting/v8_db.cpp b/src/mongo/scripting/v8_db.cpp index ea6cfe33591..1572ac52a3f 100644 --- a/src/mongo/scripting/v8_db.cpp +++ b/src/mongo/scripting/v8_db.cpp @@ -743,8 +743,9 @@ namespace mongo { // uassert if invalid base64 string string tmpBase64 = base64::decode(*utf); // length property stores the decoded length - it->ForceSet(scope->v8StringData("len"), v8::Number::New(tmpBase64.length())); - it->ForceSet(scope->v8StringData("type"), type); + it->ForceSet(scope->v8StringData("len"), v8::Number::New(tmpBase64.length()), + v8::ReadOnly); + it->ForceSet(scope->v8StringData("type"), type, v8::ReadOnly); it->SetInternalField(0, args[1]); } else if (args.Length() != 0) { @@ -775,15 +776,14 @@ namespace mongo { v8::Handle binDataToHex(V8Scope* scope, const v8::Arguments& args) { v8::Handle it = args.This(); verify(scope->BinDataFT()->HasInstance(it)); - int len = v8::Handle::Cast(it->Get(v8::String::New("len")))->Int32Value(); verify(it->InternalFieldCount() == 1); string data = base64::decode(toSTLString(it->GetInternalField(0))); stringstream ss; ss.setf (ios_base::hex, ios_base::basefield); ss.fill ('0'); ss.setf (ios_base::right, ios_base::adjustfield); - for(int i = 0; i < len; i++) { - unsigned v = (unsigned char) data[i]; + for(std::string::iterator it = data.begin(); it != data.end(); ++it) { + unsigned v = (unsigned char) *it; ss << setw(2) << v; } return v8::String::New(ss.str().c_str()); -- cgit v1.2.1