diff --git a/src/node_crypto.cc b/src/node_crypto.cc index 46faba2c80..075a2e3b1b 100644 --- a/src/node_crypto.cc +++ b/src/node_crypto.cc @@ -3984,6 +3984,8 @@ Handle PBKDF2(const Arguments& args) { if (args[4]->IsFunction()) { req->obj = Persistent::New(Object::New()); req->obj->Set(String::New("ondone"), args[4]); + SetActiveDomain(req->obj); + uv_queue_work(uv_default_loop(), &req->work_req, EIO_PBKDF2, @@ -4111,6 +4113,7 @@ Handle RandomBytes(const Arguments& args) { if (args[1]->IsFunction()) { req->obj_ = Persistent::New(Object::New()); req->obj_->Set(String::New("ondone"), args[1]); + SetActiveDomain(req->obj_); uv_queue_work(uv_default_loop(), &req->work_req_, diff --git a/src/util.h b/src/util.h index fbfaf7aac1..0de705d136 100644 --- a/src/util.h +++ b/src/util.h @@ -26,6 +26,20 @@ #include "string_bytes.h" namespace node { +// defined in node.cc +extern v8::Persistent process_symbol; +extern v8::Persistent domain_symbol; + +inline void SetActiveDomain(v8::Persistent obj) { + assert(!process_symbol.IsEmpty()); + assert(!domain_symbol.IsEmpty()); + v8::Local domain = v8::Context::GetCurrent() + ->Global() + ->Get(process_symbol) + ->ToObject() + ->Get(domain_symbol); + obj->Set(domain_symbol, domain); +} class Utf8Value { public: diff --git a/test/simple/test-crypto-domains.js b/test/simple/test-crypto-domains.js new file mode 100644 index 0000000000..0562fe45b0 --- /dev/null +++ b/test/simple/test-crypto-domains.js @@ -0,0 +1,44 @@ +// Copyright Joyent, Inc. and other Node contributors. + +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: + +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. + +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +var crypto = require('crypto'); +var domain = require('domain'); +var assert = require('assert'); +var d = domain.create(); +var expect = ['pbkdf2', 'randomBytes', 'pseudoRandomBytes'] + +d.on('error', function (e) { + assert.equal(e.message, expect.shift()); +}); + +d.run(function () { + crypto.pbkdf2('a', 'b', 1, 8, function () { + throw new Error('pbkdf2'); + }); + + crypto.randomBytes(4, function () { + throw new Error('randomBytes'); + }); + + crypto.pseudoRandomBytes(4, function () { + throw new Error('pseudoRandomBytes'); + }); +});