diff --git a/src/node_crypto.cc b/src/node_crypto.cc index 5b21e55a8c..dc5da802bb 100644 --- a/src/node_crypto.cc +++ b/src/node_crypto.cc @@ -4354,7 +4354,7 @@ typedef int (*RandomBytesGenerator)(unsigned char* buf, int size); struct RandomBytesRequest { ~RandomBytesRequest(); - Persistent callback_; + Persistent obj_; unsigned long error_; // openssl error code or zero uv_work_t work_req_; size_t size_; @@ -4363,10 +4363,9 @@ struct RandomBytesRequest { RandomBytesRequest::~RandomBytesRequest() { - if (!callback_.IsEmpty()) { - callback_.Dispose(); - callback_.Clear(); - } + if (obj_.IsEmpty()) return; + obj_.Dispose(); + obj_.Clear(); } @@ -4427,12 +4426,7 @@ void RandomBytesAfter(uv_work_t* work_req) { HandleScope scope; Local argv[2]; RandomBytesCheck(req, argv); - - // XXX There should be an object connected to this that - // we can attach a domain onto. - MakeCallback(Context::GetCurrent()->Global(), - req->callback_, - ARRAY_SIZE(argv), argv); + MakeCallback(req->obj_, "ondone", ARRAY_SIZE(argv), argv); delete req; } @@ -4457,15 +4451,15 @@ Handle RandomBytes(const Arguments& args) { req->size_ = size; if (args[1]->IsFunction()) { - Local callback_v = Local(Function::Cast(*args[1])); - req->callback_ = Persistent::New(callback_v); + req->obj_ = Persistent::New(Object::New()); + req->obj_->Set(String::New("ondone"), args[1]); uv_queue_work(uv_default_loop(), &req->work_req_, RandomBytesWork, RandomBytesAfter); - return Undefined(); + return req->obj_; } else { Local argv[2]; diff --git a/test/simple/test-domain-crypto.js b/test/simple/test-domain-crypto.js new file mode 100644 index 0000000000..532a8b09d3 --- /dev/null +++ b/test/simple/test-domain-crypto.js @@ -0,0 +1,36 @@ +// 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. + +try { + var crypto = require('crypto'); +} catch (e) { + console.log('Not compiled with OPENSSL support.'); + process.exit(); +} + +// the missing var keyword is intentional +domain = require('domain'); + +// should not throw a 'TypeError: undefined is not a function' exception +crypto.randomBytes(8); +crypto.randomBytes(8, function() {}); +crypto.pseudoRandomBytes(8); +crypto.pseudoRandomBytes(8, function() {});