fs: fix cpSync handle existing symlinks · nodejs/node@d2931e5

2 files changed

lines changed

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}`,

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