Skip to content

Commit d2931e5

Browse files
jakecastellitargos
authored andcommitted
fs: fix cpSync handle existing symlinks
PR-URL: #58476 Fixes: #58468 Reviewed-By: Dario Piotrowicz <[email protected]>
1 parent 6c92329 commit d2931e5

File tree

2 files changed

+15
-2
lines changed

2 files changed

+15
-2
lines changed

lib/internal/fs/cp/cp-sync.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,9 @@ function onLink(destStat, src, dest, verbatimSymlinks) {
196196
if (!isAbsolute(resolvedDest)) {
197197
resolvedDest = resolve(dirname(dest), resolvedDest);
198198
}
199-
if (isSrcSubdir(resolvedSrc, resolvedDest)) {
199+
const srcIsDir = fsBinding.internalModuleStat(src) === 1;
200+
201+
if (srcIsDir && isSrcSubdir(resolvedSrc, resolvedDest)) {
200202
throw new ERR_FS_CP_EINVAL({
201203
message: `cannot copy ${resolvedSrc} to a subdirectory of self ` +
202204
`${resolvedDest}`,

test/parallel/test-fs-cp.mjs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ const {
1515
writeFileSync,
1616
} = fs;
1717
import net from 'net';
18-
import { join } from 'path';
18+
import { join, resolve } from 'path';
1919
import { pathToFileURL } from 'url';
2020
import { setTimeout } from 'timers/promises';
2121

@@ -248,6 +248,17 @@ function nextdir(dirname) {
248248
);
249249
}
250250

251+
// It allows copying when is not a directory
252+
{
253+
const src = nextdir();
254+
const dest = nextdir();
255+
mkdirSync(src, mustNotMutateObjectDeep({ recursive: true }));
256+
writeFileSync(`${src}/test.txt`, 'test');
257+
symlinkSync(resolve(`${src}/test.txt`), join(src, 'link.txt'));
258+
cpSync(src, dest, mustNotMutateObjectDeep({ recursive: true }));
259+
cpSync(src, dest, mustNotMutateObjectDeep({ recursive: true }));
260+
}
261+
251262
// It throws error if symlink in dest points to location in src.
252263
{
253264
const src = nextdir();

0 commit comments

Comments
 (0)