diff --git a/src/node_file.cc b/src/node_file.cc index 0e639b6d356ed3..f569eea1a7f9b8 100644 --- a/src/node_file.cc +++ b/src/node_file.cc @@ -3147,7 +3147,14 @@ static void CpSyncCheckPaths(const FunctionCallbackInfo& args) { ? std::filesystem::symlink_status(src_path, error_code) : std::filesystem::status(src_path, error_code); if (error_code) { - return env->ThrowUVException(EEXIST, "lstat", nullptr, src.out()); +#ifdef _WIN32 + int errorno = uv_translate_sys_error(error_code.value()); +#else + int errorno = + error_code.value() > 0 ? -error_code.value() : error_code.value(); +#endif + return env->ThrowUVException( + errorno, dereference ? "stat" : "lstat", nullptr, src.out()); } auto dest_status = dereference ? std::filesystem::symlink_status(dest_path, error_code) diff --git a/test/parallel/test-fs-cp.mjs b/test/parallel/test-fs-cp.mjs index c888b5c30e042d..16a52bc12c49f1 100644 --- a/test/parallel/test-fs-cp.mjs +++ b/test/parallel/test-fs-cp.mjs @@ -419,6 +419,26 @@ if (!isWindows) { ); } +// It throws an error when attempting to copy a file with a name that is too long. +{ + const src = 'a'.repeat(5000); + const dest = nextdir(); + assert.throws( + () => cpSync(src, dest), + { code: isWindows ? 'ENOENT' : 'ENAMETOOLONG' } + ); +} + +// It throws an error when attempting to copy a dir that does not exist. +{ + const src = nextdir(); + const dest = nextdir(); + assert.throws( + () => cpSync(src, dest, mustNotMutateObjectDeep({ recursive: true })), + { code: 'ENOENT' } + ); +} + // It makes file writeable when updating timestamp, if not writeable. { const src = nextdir();