From 980e96afe468adeeb6312a0eaa1501289add3821 Mon Sep 17 00:00:00 2001 From: Tho Date: Sun, 25 Sep 2022 18:36:24 +0800 Subject: [PATCH] fs: fix operation not permitted fix: #44720 issue: - `copyDir()` calls `checkPathsSync()`, which invokes `lstat()` which causes error because of not checking the opts.filter changes: - check opts.filter before calling `checkPathsSync` and copy logic - cleanup `startCopy` function --- lib/internal/fs/cp/cp-sync.js | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/lib/internal/fs/cp/cp-sync.js b/lib/internal/fs/cp/cp-sync.js index f9d159a193107e..20c77fc7cb1631 100644 --- a/lib/internal/fs/cp/cp-sync.js +++ b/lib/internal/fs/cp/cp-sync.js @@ -158,11 +158,6 @@ function handleFilterAndCopy(destStat, src, dest, opts) { return getStats(destStat, src, dest, opts); } -function startCopy(destStat, src, dest, opts) { - if (opts.filter && !opts.filter(src, dest)) return; - return getStats(destStat, src, dest, opts); -} - function getStats(destStat, src, dest, opts) { const statSyncFn = opts.dereference ? statSync : lstatSync; const srcStat = statSyncFn(src); @@ -284,9 +279,9 @@ function copyDir(src, dest, opts) { const { name } = dirent; const srcItem = join(src, name); const destItem = join(dest, name); + if (opts.filter && !opts.filter(srcItem, destItem)) continue; const { destStat } = checkPathsSync(srcItem, destItem, opts); - - startCopy(destStat, srcItem, destItem, opts); + getStats(destStat, srcItem, destItem, opts); } } finally { dir.closeSync();