Skip to content

Commit 6c83503

Browse files
committed
fs: check subdir correct in cpSync
1 parent 8b8fc53 commit 6c83503

File tree

2 files changed

+14
-3
lines changed

2 files changed

+14
-3
lines changed

src/node_file.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3193,7 +3193,7 @@ static void CpSyncCheckPaths(const FunctionCallbackInfo<Value>& args) {
31933193

31943194
std::string dest_path_str = dest_path.string();
31953195
// Check if dest_path is a subdirectory of src_path.
3196-
if (src_is_dir && dest_path_str.starts_with(src_path.string())) {
3196+
if (src_is_dir && dest_path.parent_path().string().starts_with(src_path.string())) {
31973197
std::string message = "Cannot copy " + src_path.string() +
31983198
" to a subdirectory of self " + dest_path.string();
31993199
return THROW_ERR_FS_CP_EINVAL(env, message.c_str());

test/parallel/test-fs-cp.mjs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ import tmpdir from '../common/tmpdir.js';
2424
tmpdir.refresh();
2525

2626
let dirc = 0;
27-
function nextdir() {
28-
return tmpdir.resolve(`copy_${++dirc}`);
27+
function nextdir(dirname) {
28+
return tmpdir.resolve(dirname || `copy_${++dirc}`);
2929
}
3030

3131
// Synchronous implementation of copy.
@@ -312,6 +312,17 @@ function nextdir() {
312312
);
313313
}
314314

315+
// It must not throw error if attempt is made to copy to dest
316+
// directory with same prefix as src directory
317+
// regression test for https://github.com/nodejs/node/issues/54285
318+
{
319+
const src = nextdir('prefix');
320+
const dest = nextdir('prefix-a');
321+
mkdirSync(src);
322+
mkdirSync(dest);
323+
cpSync(src, dest, { recursive: true });
324+
}
325+
315326
// It throws error if attempt is made to copy to subdirectory of self.
316327
{
317328
const src = './test/fixtures/copy/kitchen-sink';

0 commit comments

Comments
 (0)