Skip to content

Commit 2990f17

Browse files
Sylphy-0xd3acRafaelGSS
authored andcommitted
fs: fix glob TypeError on restricted dirs
When a directory cannot be read due to permission issues, the async version of fs.glob() returns null from readdir(), while the sync version returns an empty array. This causes a TypeError when trying to access the 'length' property of null. PR-URL: #58674Fixes: #58670Fixes: #58276 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Ethan-Arrowood <ethan@arrowood.dev> Reviewed-By: Juan José <soyjuanarbol@gmail.com>
1 parent a056dd3 commit 2990f17

2 files changed

Lines changed: 23 additions & 2 deletions

File tree

‎lib/internal/fs/glob.js‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ class Cache {
143143
if(cached){
144144
returncached;
145145
}
146-
constpromise=PromisePrototypeThen(readdir(path,{__proto__: null,withFileTypes: true}),null,()=>null);
146+
constpromise=PromisePrototypeThen(readdir(path,{__proto__: null,withFileTypes: true}),null,()=>[]);
147147
this.#readdirCache.set(path,promise);
148148
returnpromise;
149149
}

‎test/parallel/test-fs-glob.mjs‎

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import * as common from '../common/index.mjs';
22
importtmpdirfrom'../common/tmpdir.js';
33
import{resolve,dirname,sep,relative,join,isAbsolute}from'node:path';
44
import{mkdir,writeFile,symlink,globasasyncGlob}from'node:fs/promises';
5-
import{glob,globSync,Dirent}from'node:fs';
5+
import{glob,globSync,Dirent,chmodSync}from'node:fs';
66
import{test,describe}from'node:test';
77
import{pathToFileURL}from'node:url';
88
import{promisify}from'node:util';
@@ -518,3 +518,24 @@ describe('fsPromises glob - exclude', function() {
518518
});
519519
}
520520
});
521+
522+
describe('glob - with restricted directory',function(){
523+
test('*',async()=>{
524+
constrestrictedDir=tmpdir.resolve('restricted');
525+
awaitmkdir(restrictedDir,{recursive: true});
526+
chmodSync(restrictedDir,0o000);
527+
try{
528+
constresults=[];
529+
forawait(constmatchofasyncGlob('*',{cwd: restrictedDir})){
530+
results.push(match);
531+
}
532+
assert.ok(true,'glob completed without throwing on readdir error');
533+
}finally{
534+
try{
535+
chmodSync(restrictedDir,0o755);
536+
}catch{
537+
// ignore
538+
}
539+
}
540+
});
541+
});

0 commit comments

Comments
 (0)