aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTobias Nießen <tniessen@tnie.de>2017-04-02 15:00:32 +0200
committerAnna Henningsen <anna@addaleax.net>2017-04-10 16:37:09 +0200
commit88351a22eda7c2d3371a1faaaa30ab846ce77f52 (patch)
tree9b199102b865e65df283d86468630a2938085bb6 /src
parentcecdf7c1187aecc0e34c7bfffef68f8faf1ecf09 (diff)
downloadandroid-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.cc2
-rw-r--r--src/node_crypto.cc20
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);