Skip to content

fs.writeFile(Sync): mode option is ignored in some cases #2249

@targos

Description

@targos

Original issue: nodejs/node-v0.x-archive#25756

fs.writeFile(Sync) has a bug regarding the mode option:

  • If the file is not existing, it is sometimes created with a different mode (see test case, I didn't try all possible combinations). (not-a-bug, umask at work)
  • If the file is already existing, its mode is kept unchanged.

Our tests are not catching this because we use 755 and it is one of the working cases.

I suspect a bug in libuv's open method. The mode seems to be correctly passed from our code.

Test case (tested on OSX 10.10):

'use strict';

const filename = 'a00.txt';
const fs = require('fs');

remove(); write();
logMode('new file, 666 (default)');
remove(); write(0o756);
logMode('new file, 756');
remove(); write(0o565);
logMode('new file, 565');
remove(); write(0o755);
logMode('new file, 755');
remove(); write(0o444);
logMode('new file, 444');
chmod(0o777);
logMode('chmod, 777');
write(0o666);
logMode('replace, 666');
write(0o756);
logMode('replace, 756');
write(0o565);
logMode('replace, 565');
write(0o755);
logMode('replace, 755');
write(0o444);
logMode('replace, 444');

function remove() {
    try {
        fs.unlinkSync(filename);
    } catch (e) {}
}
function chmod(mode) {
    fs.chmodSync(filename, mode);
}
function write(mode) {
    fs.writeFileSync(filename, 'hello', {mode: mode});
}
function logMode(message) {
    console.log(fs.statSync(filename).mode.toString(8) + ' (' + message + ')');
}

Output :

100644 (new file, 666 (default))
100754 (new file, 756)
100545 (new file, 565)
100755 (new file, 755)
100444 (new file, 444)
100777 (chmod, 777)
100777 (replace, 666)
100777 (replace, 756)
100777 (replace, 565)
100777 (replace, 755)
100777 (replace, 444)

/cc @saghul ?

Metadata

Metadata

Assignees

No one assigned

    Labels

    fsIssues and PRs related to the fs subsystem / file system.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions