fs: fix glob TypeError on restricted dirs · nodejs/node@2990f17

2 files changed

lines changed

Original file line numberDiff line numberDiff line change

@@ -143,7 +143,7 @@ class Cache {

143143

if (cached) {

144144

return cached;

145145

}

146-

const promise = PromisePrototypeThen(readdir(path, { __proto__: null, withFileTypes: true }), null, () => null);

146+

const promise = PromisePrototypeThen(readdir(path, { __proto__: null, withFileTypes: true }), null, () => []);

147147

this.#readdirCache.set(path, promise);

148148

return promise;

149149

}

Original file line numberDiff line numberDiff line change

@@ -2,7 +2,7 @@ import * as common from '../common/index.mjs';

22

import tmpdir from '../common/tmpdir.js';

33

import { resolve, dirname, sep, relative, join, isAbsolute } from 'node:path';

44

import { mkdir, writeFile, symlink, glob as asyncGlob } 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+

const restrictedDir = tmpdir.resolve('restricted');

525+

await mkdir(restrictedDir, { recursive: true });

526+

chmodSync(restrictedDir, 0o000);

527+

try {

528+

const results = [];

529+

for await (const match of asyncGlob('*', { 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+

});