Skip to content

Commit a0cb04b

Browse files
committed
(Closes #93) libs/mkdirs: prevent stack overflow if drive is not mounted in Windows
1 parent 76dcfa9 commit a0cb04b

File tree

2 files changed

+38
-1
lines changed

2 files changed

+38
-1
lines changed
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
var assert = require('assert')
2+
var path = require('path')
3+
var os = require('os')
4+
var fse = require(process.cwd())
5+
6+
/* global before, describe, it */
7+
8+
describe('mkdirp: issue-93, win32, when drive does not exist, it should return a cleaner error', function () {
9+
var TEST_DIR
10+
11+
// only seems to be an issue on Windows.
12+
if (process.platform !== 'win32') return
13+
14+
before(function (done) {
15+
TEST_DIR = path.join(os.tmpdir(), 'tests', 'fs-extra', 'mkdirp-issue-93')
16+
fse.emptyDir(TEST_DIR, function (err) {
17+
assert.ifError(err)
18+
done()
19+
})
20+
})
21+
22+
it('should return a cleaner error than inifinite loop, stack crash', function (done) {
23+
var file = 'R:\\afasd\\afaff\\fdfd' // hopefully drive 'r' does not exist on appveyor
24+
fse.mkdirp(file, function (err) {
25+
assert.strictEqual(err.code, 'ENOENT')
26+
27+
try {
28+
fse.mkdirsSync(file)
29+
} catch (err) {
30+
assert.strictEqual(err.code, 'ENOENT')
31+
}
32+
33+
done()
34+
})
35+
})
36+
})

lib/mkdirs/mkdirs-sync.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ function mkdirsSync (p, opts, made) {
2323
made = made || p
2424
} catch (err0) {
2525
switch (err0.code) {
26-
case 'ENOENT' :
26+
case 'ENOENT':
27+
if (path.dirname(p) === p) throw err0
2728
made = mkdirsSync(path.dirname(p), opts, made)
2829
mkdirsSync(p, opts, made)
2930
break

0 commit comments

Comments
 (0)