jprichardson / node-fs-extra

Node.js: extra methods for the fs object like copy(), remove(), mkdirs()
MIT License
9.43k stars 775 forks source link

Bug in onSymlink #1027

Open znewsham opened 9 months ago

znewsham commented 9 months ago

There is a bug when copying a directory containing a symlink onto itself (e.g., if you were making an rsync type utility):

If options.dereference is not set, then resolvedSrc and resolvedDest will always be equal - since they are the value of the symlink.

        if (stat.isSrcSubdir(resolvedSrc, resolvedDest)) {
          return cb(new Error(`Cannot copy '${resolvedSrc}' to a subdirectory of itself, '${resolvedDest}'.`))
        }

this code needs to be changed to

if (options.dereference && stat.isSrcSubdir(resolvedSrc, resolvedDest)) {

Probably a similar change is required here:

if (destStat.isDirectory() && stat.isSrcSubdir(resolvedDest, resolvedSrc)) {
RyanZim commented 9 months ago

Confirmed bug; but we need something more complicated than your proposed fix. We can't simply ignore these checks when we're not dereferencing; just one example case: https://github.com/jprichardson/node-fs-extra/blob/a277cbbdf630424482b1e7418749ccaac0db98fe/lib/copy/__tests__/copy-prevent-copying-into-itself.test.js#L351