mirror of
https://github.com/nodejs/node.git
synced 2024-11-21 10:59:27 +00:00
src: don't print garbage errors
If JS throws an object whose toString() method throws, then Node attempts to print an empty message, but actually prints garbage. This commit checks for this case, and prints a message instead. Fixes: https://github.com/nodejs/node/issues/4079 PR-URL: https://github.com/nodejs/node/pull/4112 Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> Reviewed-By: Chris Dickinson <christopher.s.dickinson@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Minwoo Jung <jmwsoft@gmail.com>
This commit is contained in:
parent
e6e78910af
commit
1ec09b0449
@ -1511,8 +1511,10 @@ static void ReportException(Environment* env,
|
||||
name.IsEmpty() ||
|
||||
name->IsUndefined()) {
|
||||
// Not an error object. Just print as-is.
|
||||
node::Utf8Value message(env->isolate(), er);
|
||||
PrintErrorString("%s\n", *message);
|
||||
String::Utf8Value message(er);
|
||||
|
||||
PrintErrorString("%s\n", *message ? *message :
|
||||
"<toString() threw exception>");
|
||||
} else {
|
||||
node::Utf8Value name_string(env->isolate(), name);
|
||||
node::Utf8Value message_string(env->isolate(), message);
|
||||
|
5
test/fixtures/throws_error7.js
vendored
Normal file
5
test/fixtures/throws_error7.js
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
throw {
|
||||
toString: function() {
|
||||
throw this;
|
||||
}
|
||||
};
|
@ -24,8 +24,6 @@ function errExec(script, callback) {
|
||||
|
||||
// Count the tests
|
||||
exits++;
|
||||
|
||||
console.log('.');
|
||||
});
|
||||
}
|
||||
|
||||
@ -64,6 +62,11 @@ errExec('throws_error6.js', function(err, stdout, stderr) {
|
||||
assert.ok(/SyntaxError/.test(stderr));
|
||||
});
|
||||
|
||||
process.on('exit', function() {
|
||||
assert.equal(6, exits);
|
||||
// Object that throws in toString() doesn't print garbage
|
||||
errExec('throws_error7.js', function(err, stdout, stderr) {
|
||||
assert.ok(/<toString\(\) threw exception/.test(stderr));
|
||||
});
|
||||
|
||||
process.on('exit', function() {
|
||||
assert.equal(7, exits);
|
||||
});
|
||||
|
Loading…
Reference in New Issue
Block a user