summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin (Kun) "Kassimo" Qian <kevinkassimo@gmail.com>2019-01-18 12:15:09 -0800
committerRyan Dahl <ry@tinyclouds.org>2019-01-18 15:15:09 -0500
commitf9b167deb07a650590b7f1eef8fe86bf9e22d211 (patch)
tree642b10701c8e252bbb8655c8dbc255e8c3efb01a
parent315e4abd7e88c428e78c006ccf2dfdb499911a05 (diff)
Avoid crashes on ES module resolution when module not found (#1546)
-rw-r--r--libdeno/binding.cc8
-rw-r--r--src/isolate.rs11
-rw-r--r--tests/error_009_missing_js_module.js1
-rw-r--r--tests/error_009_missing_js_module.js.out1
-rw-r--r--tests/error_009_missing_js_module.test4
5 files changed, 22 insertions, 3 deletions
diff --git a/libdeno/binding.cc b/libdeno/binding.cc
index d292f2638..000529304 100644
--- a/libdeno/binding.cc
+++ b/libdeno/binding.cc
@@ -558,7 +558,11 @@ v8::MaybeLocal<v8::Module> ResolveCallback(v8::Local<v8::Context> context,
if (d->resolve_module_.IsEmpty()) {
// Resolution Error.
- isolate->ThrowException(v8_str("module resolution error"));
+ std::stringstream err_ss;
+ err_ss << "NotFound: Cannot resolve module \"" << specifier_c
+ << "\" from \"" << referrer_filename << "\"";
+ auto resolve_error = v8_str(err_ss.str().c_str());
+ isolate->ThrowException(resolve_error);
return v8::MaybeLocal<v8::Module>();
} else {
auto module = d->resolve_module_.Get(isolate);
@@ -612,6 +616,8 @@ bool ExecuteMod(v8::Local<v8::Context> context, const char* js_filename,
auto module = maybe_module.ToLocalChecked();
auto maybe_ok = module->InstantiateModule(context, ResolveCallback);
if (maybe_ok.IsNothing()) {
+ DCHECK(try_catch.HasCaught());
+ HandleException(context, try_catch.Exception());
return false;
}
diff --git a/src/isolate.rs b/src/isolate.rs
index bbd52c64d..5100ac490 100644
--- a/src/isolate.rs
+++ b/src/isolate.rs
@@ -403,8 +403,15 @@ extern "C" fn resolve_cb(
debug!("module_resolve callback {} {}", specifier, referrer);
let isolate = unsafe { Isolate::from_raw_ptr(user_data) };
- let out =
- code_fetch_and_maybe_compile(&isolate.state, specifier, referrer).unwrap();
+ let maybe_out =
+ code_fetch_and_maybe_compile(&isolate.state, specifier, referrer);
+
+ if maybe_out.is_err() {
+ // Resolution failure
+ return;
+ }
+
+ let out = maybe_out.unwrap();
let filename = CString::new(out.filename.clone()).unwrap();
let filename_ptr = filename.as_ptr() as *const i8;
diff --git a/tests/error_009_missing_js_module.js b/tests/error_009_missing_js_module.js
new file mode 100644
index 000000000..e6ca88934
--- /dev/null
+++ b/tests/error_009_missing_js_module.js
@@ -0,0 +1 @@
+import "./bad-module.js";
diff --git a/tests/error_009_missing_js_module.js.out b/tests/error_009_missing_js_module.js.out
new file mode 100644
index 000000000..1bcd9099e
--- /dev/null
+++ b/tests/error_009_missing_js_module.js.out
@@ -0,0 +1 @@
+NotFound: Cannot resolve module "./bad-module.js" from "[WILDCARD]/tests/error_009_missing_js_module.js"
diff --git a/tests/error_009_missing_js_module.test b/tests/error_009_missing_js_module.test
new file mode 100644
index 000000000..b16bb232b
--- /dev/null
+++ b/tests/error_009_missing_js_module.test
@@ -0,0 +1,4 @@
+args: tests/error_009_missing_js_module.js
+check_stderr: true
+exit_code: 1
+output: tests/error_009_missing_js_module.js.out \ No newline at end of file