fs,doc,test: open reserved characters under win32#13875
fs,doc,test: open reserved characters under win32#13875XadillaX wants to merge 5 commits intonodejs:masterfrom
Conversation
lib/fs.js
Outdated
There was a problem hiding this comment.
I'm not sure this extra closure is needed. Perhaps it could just be process.nextTick(req.oncomplete, err).
There was a problem hiding this comment.
@mscdex sometimes req.oncomplete depends on req, eg.
var context = new ReadFileContext(callback, options.encoding);
context.isUserFd = isFd(path); // file descriptor ownership
var req = new FSReqWrap();
req.context = context;
req.oncomplete = readFileAfterOpen;
...
function readFileAfterOpen(err, fd) {
var context = this.context;
...
}There was a problem hiding this comment.
I see. Perhaps we could at least factor out the callback then, like:
process.nextTick(onWinOpenErrorNT, req, err);
// ...
function onWinOpenErrorNT(req, err) {
req.oncomplete(err);
}|
I wonder if having two separate implementations, one for posix and one for Windows, would help any performance-wise? I think it definitely would on node v6.x, which still uses Crankshaft and would possibly allow the posix version to be inlineable. |
|
@mscdex Now only one call stack is added, and an |
lib/fs.js
Outdated
There was a problem hiding this comment.
If we're going to start explicitly checking for these, perhaps we should be checking for all of the reserved characters, either here in JS or at the libuv layer (via a flag of some kind if not enforced all the time for Windows).
EDIT: I just saw your comment about the other reserved characters. I'm wondering if we actually test for those on Windows nodes in CI...
|
Did you test other invalid characters and/or filenames (like https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx#Naming_Conventions |
I will try it tomorrow, now it's 1:11 a.m. at my location and I'm going to sleep. |
|
@mscdex @silverwind Sorry, I'm going to take a vacation for one week and now I don't have a Windows computer at my hand. So maybe I will continue to work for this PR after one week. |
lib/fs.js
Outdated
There was a problem hiding this comment.
Maybe the stringToFlags() calls should be pushed into openWrap() too.
lib/fs.js
Outdated
There was a problem hiding this comment.
Style nit: single line if statements shouldn't have curly braces.
lib/internal/errors.js
Outdated
There was a problem hiding this comment.
I think the errors in this file are sorted by error code.
There was a problem hiding this comment.
I don't think you have to add this for new files.
There was a problem hiding this comment.
Can you use common.skip() here.
There was a problem hiding this comment.
Can you add common.mustCall() to the readFile() and writeFile() callbacks in this file.
There was a problem hiding this comment.
Please use ^ and $ to match the full error message.
|
I agree with @mscdex, if we do this checking, it's better done in libuv. Of course, it's also possible to delegate the task of checking if a filename is valid for a platform to the user, for example through modules like https://github.com/sindresorhus/valid-filename. |
|
@silverwind To be honest, I think libuv's PR progress is much slower than Node.js'. I will continue to work for other reserved names by implement a checking function next week after my vacation. |
Enjoy 🍹 |
|
This |
|
Oh, forgot to add that I'm -1 on this. |
@bzoz It has an element of surprise (alternative streams I personally keep forgetting about). Should we at least document this? Or maybe add special syntax for? |
|
IMHO we should document this. Special syntax would be surprising for everyone that already knows this feature. It would also add maintenance burden. |
|
@bzoz so what I should do is just to document it? |
|
I guess so. The streams feature of NTFS is surprising, we can mention it in the docs and add a link to MSDN: https://msdn.microsoft.com/en-us/library/windows/desktop/bb540537.aspx |
|
I'll update this issue to document this feature after I'm back. |
9498ec8 to
e90f5cb
Compare
86dc587 to
c1c5d57
Compare

Explain the behavior of
fs.open()under win32 that file path containssome characters and add some test cases for them.
Refs: #13868
Refs: https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx
Refs: https://msdn.microsoft.com/en-us/library/windows/desktop/bb540537.aspx
Checklist
make -j4 test(UNIX)Affected core subsystem(s)
fs, doc, test