From edc9efa5c8b7e2f2fc86aa8e1fe7fd276003e02a Mon Sep 17 00:00:00 2001 From: cjihrig Date: Wed, 20 Nov 2019 16:06:08 -0500 Subject: [PATCH] fs: only operate on buffers in rimraf PR-URL: https://github.com/nodejs/node/pull/30569 Reviewed-By: Jiawen Geng Reviewed-By: Anna Henningsen Reviewed-By: Rich Trott Reviewed-By: Ben Coe Reviewed-By: Ruben Bridgewater --- lib/internal/fs/rimraf.js | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/lib/internal/fs/rimraf.js b/lib/internal/fs/rimraf.js index be7e1ba154ba97..590b86dddacf65 100644 --- a/lib/internal/fs/rimraf.js +++ b/lib/internal/fs/rimraf.js @@ -11,6 +11,7 @@ const { Set, } = primordials; +const { Buffer } = require('buffer'); const { chmod, chmodSync, @@ -25,7 +26,7 @@ const { unlink, unlinkSync } = require('fs'); -const { join } = require('path'); +const { sep } = require('path'); const { setTimeout } = require('timers'); const { sleep } = require('internal/util'); const notEmptyErrorCodes = new Set(['ENOTEMPTY', 'EEXIST', 'EPERM']); @@ -34,6 +35,8 @@ const retryErrorCodes = new Set( const isWindows = process.platform === 'win32'; const epermHandler = isWindows ? fixWinEPERM : _rmdir; const epermHandlerSync = isWindows ? fixWinEPERMSync : _rmdirSync; +const readdirEncoding = 'buffer'; +const separator = Buffer.from(sep); function rimraf(path, options, callback) { @@ -122,7 +125,9 @@ function _rmdir(path, options, originalErr, callback) { function _rmchildren(path, options, callback) { - readdir(path, (err, files) => { + const pathBuf = Buffer.from(path); + + readdir(pathBuf, readdirEncoding, (err, files) => { if (err) return callback(err); @@ -134,7 +139,9 @@ function _rmchildren(path, options, callback) { let done = false; files.forEach((child) => { - rimraf(join(path, child), options, (err) => { + const childPath = Buffer.concat([pathBuf, separator, child]); + + rimraf(childPath, options, (err) => { if (done) return; @@ -211,8 +218,12 @@ function _rmdirSync(path, options, originalErr) { // original removal. Windows has a habit of not closing handles promptly // when files are deleted, resulting in spurious ENOTEMPTY failures. Work // around that issue by retrying on Windows. - readdirSync(path).forEach((child) => { - rimrafSync(join(path, child), options); + const pathBuf = Buffer.from(path); + + readdirSync(pathBuf, readdirEncoding).forEach((child) => { + const childPath = Buffer.concat([pathBuf, separator, child]); + + rimrafSync(childPath, options); }); const tries = options.maxRetries + 1;