fs: translate error code properly in cpSync

UV error code needs to be negative integer so it can be mapped
correctly. The filesystem error are positive integer, so we need to
handle it before throwing.

Co-authored-by: Jake Yuesong Li <jake.yuesong@gmail.com>
PR-URL: https://github.com/nodejs/node/pull/54906
Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Reviewed-By: Richard Lau <rlau@redhat.com>
This commit is contained in:
Jason Zhang 2024-09-16 22:11:55 +09:30 committed by GitHub
parent 53ede878a5
commit c1afd2c8e3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 28 additions and 1 deletions

View File

@ -3147,7 +3147,14 @@ static void CpSyncCheckPaths(const FunctionCallbackInfo<Value>& 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)

View File

@ -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();