diff options
author | Tobias Nießen <tniessen@tnie.de> | 2017-04-02 15:00:32 +0200 |
---|---|---|
committer | Anna Henningsen <anna@addaleax.net> | 2017-04-10 16:37:09 +0200 |
commit | 88351a22eda7c2d3371a1faaaa30ab846ce77f52 (patch) | |
tree | 9b199102b865e65df283d86468630a2938085bb6 /src | |
parent | cecdf7c1187aecc0e34c7bfffef68f8faf1ecf09 (diff) | |
download | android-node-v8-88351a22eda7c2d3371a1faaaa30ab846ce77f52.tar.gz android-node-v8-88351a22eda7c2d3371a1faaaa30ab846ce77f52.tar.bz2 android-node-v8-88351a22eda7c2d3371a1faaaa30ab846ce77f52.zip |
crypto: handle exceptions in hmac/hash.digest
Forced conversion of the encoding parameter to a string within
crypto.js, fixing segmentation faults in node_crypto.cc.
Fixes: https://github.com/nodejs/node/issues/9819
PR-URL: https://github.com/nodejs/node/pull/12164
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/node.cc | 2 | ||||
-rw-r--r-- | src/node_crypto.cc | 20 |
2 files changed, 9 insertions, 13 deletions
diff --git a/src/node.cc b/src/node.cc index 2eadc71982..5b5be22bf3 100644 --- a/src/node.cc +++ b/src/node.cc @@ -1483,6 +1483,8 @@ enum encoding ParseEncoding(const char* encoding, enum encoding ParseEncoding(Isolate* isolate, Local<Value> encoding_v, enum encoding default_encoding) { + CHECK(!encoding_v.IsEmpty()); + if (!encoding_v->IsString()) return default_encoding; diff --git a/src/node_crypto.cc b/src/node_crypto.cc index 45b06eaff5..0f9ed3434e 100644 --- a/src/node_crypto.cc +++ b/src/node_crypto.cc @@ -3797,9 +3797,8 @@ void Hmac::HmacDigest(const FunctionCallbackInfo<Value>& args) { enum encoding encoding = BUFFER; if (args.Length() >= 1) { - encoding = ParseEncoding(env->isolate(), - args[0]->ToString(env->isolate()), - BUFFER); + CHECK(args[0]->IsString()); + encoding = ParseEncoding(env->isolate(), args[0], BUFFER); } unsigned char* md_value = nullptr; @@ -3921,9 +3920,8 @@ void Hash::HashDigest(const FunctionCallbackInfo<Value>& args) { enum encoding encoding = BUFFER; if (args.Length() >= 1) { - encoding = ParseEncoding(env->isolate(), - args[0]->ToString(env->isolate()), - BUFFER); + CHECK(args[0]->IsString()); + encoding = ParseEncoding(env->isolate(), args[0], BUFFER); } unsigned char md_value[EVP_MAX_MD_SIZE]; @@ -4201,10 +4199,8 @@ void Sign::SignFinal(const FunctionCallbackInfo<Value>& args) { unsigned int len = args.Length(); enum encoding encoding = BUFFER; - if (len >= 2 && args[1]->IsString()) { - encoding = ParseEncoding(env->isolate(), - args[1]->ToString(env->isolate()), - BUFFER); + if (len >= 2) { + encoding = ParseEncoding(env->isolate(), args[1], BUFFER); } node::Utf8Value passphrase(env->isolate(), args[2]); @@ -4452,9 +4448,7 @@ void Verify::VerifyFinal(const FunctionCallbackInfo<Value>& args) { enum encoding encoding = UTF8; if (args.Length() >= 3) { - encoding = ParseEncoding(env->isolate(), - args[2]->ToString(env->isolate()), - UTF8); + encoding = ParseEncoding(env->isolate(), args[2], UTF8); } ssize_t hlen = StringBytes::Size(env->isolate(), args[1], encoding); |