Skip to content

Commit

Permalink
src: prevent crash in TTYWrap::Initialize
Browse files Browse the repository at this point in the history
When console.log is called for the first time it initializes
TTYWrap object. However, if there is not enough space on the
V8 stack, creating function template fails and triggers
empty maybe local exception.

PR-URL: #26832
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
  • Loading branch information
Hakerh400 authored and BridgeAR committed Apr 4, 2019
1 parent b965ac2 commit 6fb32ac
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 5 deletions.
11 changes: 6 additions & 5 deletions src/tty_wrap.cc
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ namespace node {

using v8::Array;
using v8::Context;
using v8::Function;
using v8::FunctionCallbackInfo;
using v8::FunctionTemplate;
using v8::Integer;
Expand All @@ -40,7 +41,6 @@ using v8::Object;
using v8::String;
using v8::Value;


void TTYWrap::Initialize(Local<Object> target,
Local<Value> unused,
Local<Context> context,
Expand All @@ -61,10 +61,11 @@ void TTYWrap::Initialize(Local<Object> target,
env->SetMethodNoSideEffect(target, "isTTY", IsTTY);
env->SetMethodNoSideEffect(target, "guessHandleType", GuessHandleType);

target->Set(env->context(),
ttyString,
t->GetFunction(env->context()).ToLocalChecked()).FromJust();
env->set_tty_constructor_template(t);
Local<Value> func;
if (t->GetFunction(env->context()).ToLocal(&func) &&
target->Set(env->context(), ttyString, func).IsJust()) {
env->set_tty_constructor_template(t);
}
}


Expand Down
20 changes: 20 additions & 0 deletions test/parallel/test-ttywrap-stack.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
'use strict';
const common = require('../common');

// This test ensures that console.log
// will not crash the process if there
// is not enough space on the V8 stack

const done = common.mustCall(() => {});

async function test() {
await test();
}

(async () => {
try {
await test();
} catch (err) {
console.log(err);
}
})().then(done, done);

0 comments on commit 6fb32ac

Please sign in to comment.