diff --git a/doc/api/errors.md b/doc/api/errors.md index 784c9ac5a226d0..abcfa7b96f3d34 100644 --- a/doc/api/errors.md +++ b/doc/api/errors.md @@ -876,6 +876,14 @@ An unknown cipher was specified. An unknown Diffie-Hellman group name was given. See [`crypto.getDiffieHellman()`][] for a list of valid group names. + +### `ERR_DLOPEN_FAILED` + + +A call to `process.dlopen()` failed. + ### `ERR_DEBUGGER_ERROR` + +An attempt was made to load a module that does not exist or was otherwise not +valid. + ### `ERR_INVALID_MODULE_SPECIFIER` diff --git a/src/node_binding.cc b/src/node_binding.cc index d852a8f67eb1fe..8b34d601146579 100644 --- a/src/node_binding.cc +++ b/src/node_binding.cc @@ -5,6 +5,8 @@ #include "node_native_module_env.h" #include "util.h" +#include + #if HAVE_OPENSSL #define NODE_BUILTIN_OPENSSL_MODULES(V) V(crypto) V(tls_wrap) #else @@ -416,13 +418,13 @@ void DLOpen(const FunctionCallbackInfo& args) { CHECK_NULL(thread_local_modpending); if (args.Length() < 2) { - env->ThrowError("process.dlopen needs at least 2 arguments."); - return; + return THROW_ERR_MISSING_ARGS( + env, "process.dlopen needs at least 2 arguments"); } int32_t flags = DLib::kDefaultFlags; if (args.Length() > 2 && !args[2]->Int32Value(context).To(&flags)) { - return env->ThrowTypeError("flag argument must be an integer."); + return THROW_ERR_INVALID_ARG_TYPE(env, "flag argument must be an integer."); } Local module; @@ -448,15 +450,13 @@ void DLOpen(const FunctionCallbackInfo& args) { thread_local_modpending = nullptr; if (!is_opened) { - Local errmsg = - OneByteString(env->isolate(), dlib->errmsg_.c_str()); + std::string errmsg = dlib->errmsg_.c_str(); dlib->Close(); #ifdef _WIN32 // Windows needs to add the filename into the error message - errmsg = String::Concat( - env->isolate(), errmsg, args[1]->ToString(context).ToLocalChecked()); + errmsg += *filename; #endif // _WIN32 - env->isolate()->ThrowException(Exception::Error(errmsg)); + THROW_ERR_DLOPEN_FAILED(env, errmsg.c_str()); return false; } @@ -486,7 +486,7 @@ void DLOpen(const FunctionCallbackInfo& args) { sizeof(errmsg), "Module did not self-register: '%s'.", *filename); - env->ThrowError(errmsg); + THROW_ERR_DLOPEN_FAILED(env, errmsg); return false; } } @@ -517,7 +517,7 @@ void DLOpen(const FunctionCallbackInfo& args) { // NOTE: `mp` is allocated inside of the shared library's memory, calling // `dlclose` will deallocate it dlib->Close(); - env->ThrowError(errmsg); + THROW_ERR_DLOPEN_FAILED(env, errmsg); return false; } CHECK_EQ(mp->nm_flags & NM_F_BUILTIN, 0); @@ -530,7 +530,7 @@ void DLOpen(const FunctionCallbackInfo& args) { mp->nm_register_func(exports, module, mp->nm_priv); } else { dlib->Close(); - env->ThrowError("Module has no declared entry point."); + THROW_ERR_DLOPEN_FAILED(env, "Module has no declared entry point."); return false; } @@ -569,12 +569,6 @@ static Local InitModule(Environment* env, return exports; } -static void ThrowIfNoSuchModule(Environment* env, const char* module_v) { - char errmsg[1024]; - snprintf(errmsg, sizeof(errmsg), "No such module: %s", module_v); - env->ThrowError(errmsg); -} - void GetInternalBinding(const FunctionCallbackInfo& args) { Environment* env = Environment::GetCurrent(args); @@ -603,7 +597,9 @@ void GetInternalBinding(const FunctionCallbackInfo& args) { env->isolate())) .FromJust()); } else { - return ThrowIfNoSuchModule(env, *module_v); + char errmsg[1024]; + snprintf(errmsg, sizeof(errmsg), "No such module: %s", *module_v); + return THROW_ERR_INVALID_MODULE(env, errmsg); } args.GetReturnValue().Set(exports); @@ -638,7 +634,7 @@ void GetLinkedBinding(const FunctionCallbackInfo& args) { sizeof(errmsg), "No such module was linked: %s", *module_name_v); - return env->ThrowError(errmsg); + return THROW_ERR_INVALID_MODULE(env, errmsg); } Local module = Object::New(env->isolate()); @@ -653,7 +649,9 @@ void GetLinkedBinding(const FunctionCallbackInfo& args) { } else if (mod->nm_register_func != nullptr) { mod->nm_register_func(exports, module, mod->nm_priv); } else { - return env->ThrowError("Linked module has no declared entry point."); + return THROW_ERR_INVALID_MODULE( + env, + "Linked moduled has no declared entry point."); } auto effective_exports = diff --git a/src/node_errors.h b/src/node_errors.h index db3c6c92ba7dc4..7b67c4e9eb95b7 100644 --- a/src/node_errors.h +++ b/src/node_errors.h @@ -38,11 +38,13 @@ void OnFatalError(const char* location, const char* message); V(ERR_CRYPTO_TIMING_SAFE_EQUAL_LENGTH, RangeError) \ V(ERR_CRYPTO_UNKNOWN_CIPHER, Error) \ V(ERR_CRYPTO_UNKNOWN_DH_GROUP, Error) \ + V(ERR_DLOPEN_FAILED, Error) \ V(ERR_EXECUTION_ENVIRONMENT_NOT_AVAILABLE, Error) \ V(ERR_INVALID_ADDRESS, Error) \ V(ERR_INVALID_ARG_VALUE, TypeError) \ V(ERR_OSSL_EVP_INVALID_DIGEST, Error) \ V(ERR_INVALID_ARG_TYPE, TypeError) \ + V(ERR_INVALID_MODULE, Error) \ V(ERR_INVALID_THIS, TypeError) \ V(ERR_INVALID_TRANSFER_OBJECT, TypeError) \ V(ERR_MEMORY_ALLOCATION_FAILED, Error) \ @@ -107,9 +109,11 @@ ERRORS_WITH_CODE(V) "Input buffers must have the same byte length") \ V(ERR_CRYPTO_UNKNOWN_CIPHER, "Unknown cipher") \ V(ERR_CRYPTO_UNKNOWN_DH_GROUP, "Unknown DH group") \ + V(ERR_DLOPEN_FAILED, "DLOpen failed") \ V(ERR_EXECUTION_ENVIRONMENT_NOT_AVAILABLE, \ "Context not associated with Node.js environment") \ V(ERR_INVALID_ADDRESS, "Invalid socket address") \ + V(ERR_INVALID_MODULE, "No such module") \ V(ERR_INVALID_THIS, "Value of \"this\" is the wrong type") \ V(ERR_INVALID_TRANSFER_OBJECT, "Found invalid object in transferList") \ V(ERR_MEMORY_ALLOCATION_FAILED, "Failed to allocate memory") \