diff --git a/src/node_crypto.cc b/src/node_crypto.cc index 953bf1b767..3dc1bfae5f 100644 --- a/src/node_crypto.cc +++ b/src/node_crypto.cc @@ -4869,9 +4869,13 @@ void RandomBytes(const FunctionCallbackInfo& args) { return env->ThrowTypeError("size must be a number >= 0"); } - const uint32_t size = args[0]->Uint32Value(); - if (size > Buffer::kMaxLength) { - return env->ThrowTypeError("size > Buffer::kMaxLength"); + const int64_t size = args[0]->IntegerValue(); + if (using_old_buffer) { + if (size > Buffer::kMaxLength) + return env->ThrowTypeError("size > Buffer::kMaxLength"); + } else { + if (!IsValidSmi(size)) + return env->ThrowRangeError("size is not a valid Smi"); } Local obj = Object::New(env->isolate()); diff --git a/test/parallel/test-crypto-random.js b/test/parallel/test-crypto-random.js index 3454796a6b..2d28cccc4c 100644 --- a/test/parallel/test-crypto-random.js +++ b/test/parallel/test-crypto-random.js @@ -53,5 +53,5 @@ function checkCall(cb, desc) { // #5126, "FATAL ERROR: v8::Object::SetIndexedPropertiesToExternalArrayData() // length exceeds max acceptable value" assert.throws(function() { - crypto.randomBytes(0x3fffffff + 1); + crypto.randomBytes((-1 >>> 0) + 1); }, TypeError);