Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fs, test: one set of file attributes in Windows prevents fs.fchmod() from changing mode to RW and breaks incomplete test #12803

Closed
vsemozhetbyt opened this issue May 2, 2017 · 24 comments
Labels
confirmed-bug Issues with confirmed bugs. fs Issues and PRs related to the fs subsystem / file system. libuv Issues and PRs related to the libuv dependency or the uv binding. regression Issues related to regressions. test Issues and PRs related to the tests. windows Issues and PRs related to the Windows platform.

Comments

@vsemozhetbyt
Copy link
Contributor

vsemozhetbyt commented May 2, 2017

  • Version: 8.0.0 nightly 2017 05 01
  • Platform: Windows 7 x64
  • Subsystem: fs, libuv?, test

This is a confusing story here, so I am sorry for possibly clumsy wording.

Prehistory

I was launching tests with own test runner, each test with various context several times, and I've found out that parallel/test-fs-chmod.js was OK on the first run and failed on all the next ones. Moreover, this happened not on all the machines.

This turned up to be caused by some combination of a fixture file attributes.

Excursus

See this small attrib doc for context.

The test fails if both -a and -i flags are unset for a fixture file used in the test. This unsetting combination, strangely enough, correlates with this GUI setting:

Screenshot:

a


How to reproduce

Try to run these commands with repo root as cwd (firstly, we set a combination of the -a and -i flags; then we check the current attributes; then we run the test twice; then we check if the attributes are the same.; --no-deprecation key there is due to cause of #12795).

Commands :
attrib +a +i test/fixtures/a1.js
attrib test/fixtures/a1.js
node --no-deprecation test/parallel/test-fs-chmod.js
node --no-deprecation test/parallel/test-fs-chmod.js
attrib test/fixtures/a1.js

attrib +a -i test/fixtures/a1.js
attrib test/fixtures/a1.js
node --no-deprecation test/parallel/test-fs-chmod.js
node --no-deprecation test/parallel/test-fs-chmod.js
attrib test/fixtures/a1.js

attrib -a +i test/fixtures/a1.js
attrib test/fixtures/a1.js
node --no-deprecation test/parallel/test-fs-chmod.js
node --no-deprecation test/parallel/test-fs-chmod.js
attrib test/fixtures/a1.js

attrib -a -i test/fixtures/a1.js
attrib test/fixtures/a1.js
node --no-deprecation test/parallel/test-fs-chmod.js
node --no-deprecation test/parallel/test-fs-chmod.js
attrib test/fixtures/a1.js

I see this output (some path details stripped, borders added after each iteration):

Output:
/******************************************************************************/
> attrib +a +i test/fixtures/a1.js

> attrib test/fixtures/a1.js
A       I    fixtures/a1.js

> node --no-deprecation test/parallel/test-fs-chmod.js
33060
33060

> node --no-deprecation test/parallel/test-fs-chmod.js
33060
33060

> attrib test/fixtures/a1.js
A       I    fixtures/a1.js
/******************************************************************************/
> attrib +a -i test/fixtures/a1.js

> attrib test/fixtures/a1.js
A            fixtures/a1.js

> node --no-deprecation test/parallel/test-fs-chmod.js
33060
33060

> node --no-deprecation test/parallel/test-fs-chmod.js
33060
33060

> attrib test/fixtures/a1.js
A            fixtures/a1.js
/******************************************************************************/
> attrib -a +i test/fixtures/a1.js

> attrib test/fixtures/a1.js
        I    fixtures/a1.js

> node --no-deprecation test/parallel/test-fs-chmod.js
33060
33060

> node --no-deprecation test/parallel/test-fs-chmod.js
33060
33060

> attrib test/fixtures/a1.js
        I    fixtures/a1.js
/******************************************************************************/
> attrib -a -i test/fixtures/a1.js

> attrib test/fixtures/a1.js
             fixtures/a1.js

> node --no-deprecation test/parallel/test-fs-chmod.js
33060
33060

> node --no-deprecation test/parallel/test-fs-chmod.js
33060
assert.js:557
assert.ifError = function ifError(err) { if (err) throw err; };
                                                  ^

Error: EPERM: operation not permitted, open 'fixtures/a1.js'

> attrib test/fixtures/a1.js
     R       fixtures/a1.js
/******************************************************************************/

As you can see, in the last case the second test fails and the file mode is changed.

What is going on here?

test/parallel/test-fs-chmod.js changes the mode of fixtures/a.js with fs.chmod() and the mode of fixtures/a1.js with fs.fchmod() twice on Windows: to read-only and back to read-write. In case of fixtures/a.js and fs.chmod(), all is OK even with -a and -i attributes unset (I've checked this). But with fixtures/a1.js and fs.fchmod(), the beforementioned edge case prevents fs.fchmod() from the second change here: the fixtures/a1.js remains read-only after the first test run and fs.open() in append mode fails here on the second test run.

Why the test does not detect this?

This assertion before failed fs.fchmod() call and this assertion after the failed call check the same mode number in the failed case, but as long as this number is not falsy, the second assertion does not throw. On Windows, this number is not falsy in all the cases: it just differs in normal cases and remains the same in the edge case.

What possibly should be done?

  1. fs.fchmod() binding should be checked for this edge case. Maybe the bug should be reported upstream for libuv or even for Windows.
  2. The assertions in the test should be made stricter.

Unfortunately, I cannot be any more help in this case, as I am not good in this realm. Sorry.

@vsemozhetbyt vsemozhetbyt added fs Issues and PRs related to the fs subsystem / file system. libuv Issues and PRs related to the libuv dependency or the uv binding. test Issues and PRs related to the tests. windows Issues and PRs related to the Windows platform. labels May 2, 2017
@vsemozhetbyt
Copy link
Contributor Author

vsemozhetbyt commented May 2, 2017

cc @nodejs/fs, @nodejs/testing, @nodejs/platform-windows,

@refack refack self-assigned this May 3, 2017
@refack
Copy link
Contributor

refack commented May 3, 2017

@vsemozhetbyt I've added links to the file named in first comment.

@refack
Copy link
Contributor

refack commented May 3, 2017

BTW: I can repro:

c:\code\node$ attrib -a -i test/fixtures/a1.js

c:\code\node$ attrib test/fixtures/a1.js
                   C:\code\node\test\fixtures\a1.js

c:\code\node$ node --no-deprecation test/parallel/test-fs-chmod.js
33060
33060

c:\code\node$ node --no-deprecation test/parallel/test-fs-chmod.js
33060
assert.js:378
assert.ifError = function ifError(err) { if (err) throw err; };
                                                  ^

Error: EPERM: operation not permitted, open 'd:\code\node\test\fixtures\a1.js'

@refack refack added the regression Issues related to regressions. label May 4, 2017
@refack
Copy link
Contributor

refack commented May 4, 2017

It's not a edge case, it's a real regression. the test didn't detect that

fs.fchmodSync(fd, mode_sync)

Doesn't work on windows.

@refack refack added the confirmed-bug Issues with confirmed bugs. label May 4, 2017
@vsemozhetbyt
Copy link
Contributor Author

vsemozhetbyt commented May 4, 2017

Simplified reproducible test for Windows:

test.js:
/******************************************************************************/
'use strict';
/******************************************************************************/
const { strictEqual } = require('assert');
const { execSync } = require('child_process');
const { openSync, chmodSync, fchmodSync, statSync, fstatSync } = require('fs');
/******************************************************************************/
const RO = 0o100444; // 33060 0b1000000100100100
const RW = 0o100666; // 33206 0b1000000110110110

const filePath = 'abc.txt'; // or just __filename
const fd = openSync(filePath, 'a');
/******************************************************************************/
execSync(`attrib +a -i ${filePath}`); // the same with '-a +i' or '+a +i'
/******************************************************************************/
chmodSync(filePath, RW);
strictEqual(statSync(filePath).mode, RW);

chmodSync(filePath, RO);
strictEqual(statSync(filePath).mode, RO);

chmodSync(filePath, RW);
strictEqual(statSync(filePath).mode, RW);
/******************************************************************************/
fchmodSync(fd, RW);
strictEqual(fstatSync(fd).mode, RW);

fchmodSync(fd, RO);
strictEqual(fstatSync(fd).mode, RO);

fchmodSync(fd, RW);
strictEqual(fstatSync(fd).mode, RW);
/******************************************************************************/
execSync(`attrib -a -i ${filePath}`);
/******************************************************************************/
chmodSync(filePath, RW);
strictEqual(statSync(filePath).mode, RW);

chmodSync(filePath, RO);
strictEqual(statSync(filePath).mode, RO);

chmodSync(filePath, RW);
strictEqual(statSync(filePath).mode, RW);
/******************************************************************************/
fchmodSync(fd, RW);
strictEqual(fstatSync(fd).mode, RW);

fchmodSync(fd, RO);
strictEqual(fstatSync(fd).mode, RO);

fchmodSync(fd, RW); // This does not work.
strictEqual(fstatSync(fd).mode, RW); // BANG!
/******************************************************************************/

Output:
assert.js:86
  throw new assert.AssertionError({
  ^
AssertionError: 33060 === 33206
    at Object.<anonymous> (test.js:52:1)
    at Module._compile (module.js:582:30)
    at Object.Module._extensions..js (module.js:593:10)
    at Module.load (module.js:516:32)
    at tryModuleLoad (module.js:466:12)
    at Function.Module._load (module.js:458:3)
    at Function.Module.runMain (module.js:618:10)
    at startup (bootstrap_node.js:144:16)
    at bootstrap_node.js:548:3

The last fchmodSync() fails, the file remains read-only.

@refack
Copy link
Contributor

refack commented May 4, 2017

You are playing with fire manipulating __filename
Does this work for a brand new file created in process.env['TEMP']?
I'll just check...

@vsemozhetbyt
Copy link
Contributor Author

vsemozhetbyt commented May 4, 2017

@refack I've made it more abstract, but it still fails for a new file in the cwd.

@refack
Copy link
Contributor

refack commented May 4, 2017

Cut some stuff out

/******************************************************************************/
'use strict';
/******************************************************************************/
const { strictEqual } = require('assert');
const { execSync } = require('child_process');
const { openSync, chmodSync, fchmodSync, fstatSync } = require('fs');
/******************************************************************************/
const RO = 0o100444; // 33060 0b1000000100100100
const RW = 0o100666; // 33206 0b1000000110110110

const tmpFile = `${process.env['TEMP']}\\${Date.now()}gigi.js`;

const fd = openSync(tmpFile, 'a');
/******************************************************************************/
execSync(`attrib -a -i ${tmpFile}`);
/******************************************************************************/
fchmodSync(fd, RO);
const actual2 = fstatSync(fd).mode;
console.log(`${tmpFile} mode: ${actual2}`)
strictEqual(actual2, RO);

fchmodSync(fd, RW); // This does not work.
const actual3 = fstatSync(fd).mode;
console.log(`${tmpFile} mode: ${actual3}`)
strictEqual(actual3, RW); // BANG!
/******************************************************************************/

Now I got #12835 to fail with new files.
The key is execSync(`attrib -a -i ${tmpFile}`);

@vsemozhetbyt
Copy link
Contributor Author

vsemozhetbyt commented May 4, 2017

@refack Well, the plot thickens :)

I've tried to exhaust all sets of attributes. This is the more general test.

test.js:
/******************************************************************************/
'use strict';
/******************************************************************************/
const { strictEqual } = require('assert');
const { execSync } = require('child_process');
const { openSync, chmodSync, fchmodSync, statSync, fstatSync } = require('fs');
/******************************************************************************/
const winFileAttribs = ['a', 'h', 'i', 'r', 's'];
const toggles = { 0: '-', 1: '+' };

const winFileAttribSets =
  (new Array(Object.keys(toggles).length ** winFileAttribs.length))
  .fill(0)
  .map((set, setIndex) => setIndex
                         .toString(2)
                         .padStart(winFileAttribs.length, 0)
                         .split('')
                         .map((num, numIndex) =>
                           `${toggles[num]}${winFileAttribs[numIndex]}`)
                         .join(' '));
/******************************************************************************/
const RO = 0o100444; // 33060 0b1000000100100100
const RW = 0o100666; // 33206 0b1000000110110110

const filePath = 'abc.txt'; // or just __filename
const fd = openSync(filePath, 'a');
/******************************************************************************/
winFileAttribSets.forEach((winFileAttribSet) => {
  process.stdout.write(`${winFileAttribSet}: `);

  try {
    execSync(`attrib ${winFileAttribSet} ${filePath}`);
    chmodSync(filePath, RO);
    strictEqual(statSync(filePath).mode, RO, 'chmodSync -> RO');

    execSync(`attrib ${winFileAttribSet} ${filePath}`);
    chmodSync(filePath, RW);
    strictEqual(statSync(filePath).mode, RW, 'chmodSync -> RW');

    execSync(`attrib ${winFileAttribSet} ${filePath}`);
    fchmodSync(fd, RO);
    strictEqual(fstatSync(fd).mode, RO, 'fchmodSync -> RO');

    execSync(`attrib ${winFileAttribSet} ${filePath}`);
    fchmodSync(fd, RW);
    strictEqual(fstatSync(fd).mode, RW, 'fchmodSync -> RW');

    console.log('OK');
  } catch (err) {
    console.log('not OK');
    console.error('\n', err, '\n');
  }
});
/******************************************************************************/

Output:
-a -h -i -r -s: OK
-a -h -i -r +s: OK
-a -h -i +r -s: not OK

 { AssertionError: fchmodSync -> RW
    at winFileAttribSets.forEach (e:\DOC\prg\js\node\-test\test.js:46:5)
    at Array.forEach (native)
    at Object.<anonymous> (e:\DOC\prg\js\node\-test\test.js:28:19)
    at Module._compile (module.js:582:30)
    at Object.Module._extensions..js (module.js:593:10)
    at Module.load (module.js:516:32)
    at tryModuleLoad (module.js:466:12)
    at Function.Module._load (module.js:458:3)
    at Function.Module.runMain (module.js:618:10)
    at startup (bootstrap_node.js:144:16)
  name: 'AssertionError',
  actual: 33060,
  expected: 33206,
  operator: '===',
  message: 'fchmodSync -> RW',
  generatedMessage: false }

-a -h -i +r +s: OK
-a -h +i -r -s: OK
-a -h +i -r +s: OK
-a -h +i +r -s: OK
-a -h +i +r +s: OK
-a +h -i -r -s: OK
-a +h -i -r +s: OK
-a +h -i +r -s: OK
-a +h -i +r +s: OK
-a +h +i -r -s: OK
-a +h +i -r +s: OK
-a +h +i +r -s: OK
-a +h +i +r +s: OK
+a -h -i -r -s: OK
+a -h -i -r +s: OK
+a -h -i +r -s: OK
+a -h -i +r +s: OK
+a -h +i -r -s: OK
+a -h +i -r +s: OK
+a -h +i +r -s: OK
+a -h +i +r +s: OK
+a +h -i -r -s: OK
+a +h -i -r +s: OK
+a +h -i +r -s: OK
+a +h -i +r +s: OK
+a +h +i -r -s: OK
+a +h +i -r +s: OK
+a +h +i +r -s: OK
+a +h +i +r +s: OK

@refack
Copy link
Contributor

refack commented May 4, 2017

Need a good debugging session... I'll start a build...

@vsemozhetbyt
Copy link
Contributor Author

vsemozhetbyt commented May 4, 2017

So, it seems only -a -h -i -r -s set of attributes break fchmod. -a -h -i +r -s case is the same, as it becomes -a -h -i -r -s before the fail.

@refack
Copy link
Contributor

refack commented May 4, 2017

So it's probably something with either 0 or a bad bit-mask.

@refack
Copy link
Contributor

refack commented May 4, 2017

This is a trace of the system calls

19:35:14.2105663
	2180
	node.exe
	Read Metadata
	SUCCESS
	QueryBasicInformationFile
	D:\code\node\test\tmp\a1.js
	CreationTime: 04/05/2017 19:35:13
		LastAccessTime: 04/05/2017 19:35:13
		LastWriteTime: 25/04/2017 07:37:43
		ChangeTime: 04/05/2017 19:35:14
		FileAttributes: N
	REFAELUX\refael
19:35:14.2106125
	2180
	node.exe
	Write Metadata
	SUCCESS
	SetBasicInformationFile
	D:\code\node\test\tmp\a1.js
	CreationTime: 04/05/2017 19:35:13
		LastAccessTime: 04/05/2017 19:35:13
		LastWriteTime: 25/04/2017 07:37:43
		ChangeTime: 04/05/2017 19:35:14
		FileAttributes: RN
	REFAELUX\refael
19:35:14.2190395
	2180
	node.exe
	Read Metadata
	SUCCESS
	QueryBasicInformationFile
	D:\code\node\test\tmp\a1.js
	CreationTime: 04/05/2017 19:35:13
		LastAccessTime: 04/05/2017 19:35:13
		LastWriteTime: 25/04/2017 07:37:43
		ChangeTime: 04/05/2017 19:35:14
		FileAttributes: R
	REFAELUX\refael
19:35:14.2191066
	2180
	node.exe
	Write Metadata
	SUCCESS
	SetBasicInformationFile
	D:\code\node\test\tmp\a1.js
	CreationTime: 04/05/2017 19:35:13
		LastAccessTime: 04/05/2017 19:35:13
		LastWriteTime: 25/04/2017 07:37:43
		ChangeTime: 04/05/2017 19:35:14
		FileAttributes: n/a
	REFAELUX\refael
19:35:14.2191973
	2180
	node.exe
	Read Metadata
	BUFFER OVERFLOW
	QueryAllInformationFile
	D:\code\node\test\tmp\a1.js
	CreationTime: 04/05/2017 19:35:13
		LastAccessTime: 04/05/2017 19:35:13
		LastWriteTime: 25/04/2017 07:37:43
		ChangeTime: 04/05/2017 19:35:14
		FileAttributes: R
		AllocationSize: 4,096
		EndOfFile: 1,469
		NumberOfLinks: 1
		DeletePending: False
		Directory: False
		IndexNumber: 0x70000002134f1
		EaSize: 0
		Access: Append Data/Add Subdirectory/Create Pipe Instance
		Write EA
		Read Attributes
		Write Attributes
		Read Control
		Synchronize
		Position: 0
		Mode: Synchronous IO Non-Alert
		AlignmentRequirement: Word
	REFAELUX\refael

@vsemozhetbyt vsemozhetbyt changed the title fs, test: edge case in Windows prevents fs.fchmod() from changing mode and breaks incomplete test fs, test: unsetting all file attributes in Windows prevents fs.fchmod() from changing mode and breaks incomplete test May 4, 2017
@vsemozhetbyt
Copy link
Contributor Author

vsemozhetbyt commented May 5, 2017

@refack Sorry! I was wrong and the test was wrong. I've fixed it now and updated the log. We need to reset the set of file attributes each time to detect the problematic set and what change it disables. New conclusion: only -a -h -i +r -s set is problematic for fchmod, preventing it from setting RW mode (= from removing RO mode).

@vsemozhetbyt vsemozhetbyt changed the title fs, test: unsetting all file attributes in Windows prevents fs.fchmod() from changing mode and breaks incomplete test fs, test: one set of file attributes in Windows prevents fs.fchmod() from changing mode and breaks incomplete test May 5, 2017
@vsemozhetbyt vsemozhetbyt changed the title fs, test: one set of file attributes in Windows prevents fs.fchmod() from changing mode and breaks incomplete test fs, test: one set of file attributes in Windows prevents fs.fchmod() from changing mode to RW and breaks incomplete test May 5, 2017
@refack
Copy link
Contributor

refack commented May 5, 2017

@refack
Copy link
Contributor

refack commented May 5, 2017

It's like you said, we start with a regular file, remove attributes, set RO, then can't set RW.

@vsemozhetbyt
Copy link
Contributor Author

@refack Maybe it is worth to set -a -h -i -r -s in the test to be completely sure that some weird concatenation of circumstances will not set some of them on for a new file.

refack added a commit to refack/node that referenced this issue May 19, 2017
Currently this uncovers a regression in `fs.fchmodSync(fd, mode_sync);`
No solution yet...

Also as issue on macOS in test-fs-chmod:94 fail to access file1

Fixes:nodejs#12803
@Trott
Copy link
Member

Trott commented Aug 18, 2017

@refack Is this still being worked on? If not, might it make sense to unassign and/or add a help wanted label?

@vsemozhetbyt
Copy link
Contributor Author

Refs: #14926

@richardlau
Copy link
Member

The test has been rewritten by #14926. Can this be closed or is there more work to be done?

@bzoz
Copy link
Contributor

bzoz commented Oct 2, 2017

@vsemozhetbyt can this be closed now?

@vsemozhetbyt
Copy link
Contributor Author

vsemozhetbyt commented Oct 2, 2017

@richardlau , @bzoz I am not sure if rewriting the test resolves the issue in fs module.

See also #12835.

bzoz added a commit to JaneaSystems/libuv that referenced this issue Mar 19, 2018
This allows for running uv_fs_fchmod on files with Archive flag cleared

Refs: nodejs/node#12803
@bzoz
Copy link
Contributor

bzoz commented Mar 19, 2018

This is a bug in libuv, PR to fix: libuv/libuv#1777

bzoz added a commit to libuv/libuv that referenced this issue Mar 29, 2018
This allows for running uv_fs_fchmod on files with Archive flag cleared

Refs: nodejs/node#12803
PR-URL: #1777
Reviewed-By: Santiago Gimeno <[email protected]>
Reviewed-By: Colin Ihrig <[email protected]>
@cjihrig cjihrig closed this as completed in ae2b5bc Apr 5, 2018
targos pushed a commit that referenced this issue Apr 6, 2018
Notable changes:
- uv_fs_copyfile() adds support for copy-on-write behavior.
- uv_relative_path() now uses the long directory name
  for handle->dirw.
- File operations on files > 2 GB on 32-bit platforms are
  working again.
- uv_fs_fchmod() on Windows works on files with the
  Archive flag cleared.

Fixes: #19170
Fixes: #19455
Fixes: #12803
PR-URL: #19758
Reviewed-By: Ben Noordhuis <[email protected]>
Reviewed-By: Santiago Gimeno <[email protected]>
Reviewed-By: James M Snell <[email protected]>
bzoz added a commit to JaneaSystems/libuv that referenced this issue Apr 26, 2018
Adds uv_fs_chmod support for files with the Archive attribute cleared

Ref: libuv#1777
Ref: nodejs/node#12803
bzoz added a commit to JaneaSystems/libuv that referenced this issue May 16, 2018
Adds uv_fs_chmod support for files with the Archive attribute cleared

Ref: libuv#1777
Ref: nodejs/node#12803
PR-URL: libuv#1819
bzoz added a commit to libuv/libuv that referenced this issue May 17, 2018
Adds uv_fs_chmod support for files with the Archive attribute cleared

Ref: #1777
Ref: nodejs/node#12803
PR-URL: #1819
Reviewed-By: Ben Noordhuis <[email protected]>
Reviewed-By: Colin Ihrig <[email protected]>
cjihrig added a commit to cjihrig/node that referenced this issue Jun 25, 2018
Notable changes:

- Building via cmake is now supported.
  PR-URL: libuv/libuv#1850
- Stricter checks have been added to prevent watching the same
  file descriptor multiple times.
  PR-URL: libuv/libuv#1851
  Refs: nodejs#3604
- An IPC deadlock on Windows has been fixed.
  PR-URL: libuv/libuv#1843
  Fixes: nodejs#9706
  Fixes: nodejs#7657
- uv_fs_lchown() has been added.
  PR-URL: libuv/libuv#1826
  Refs: nodejs#19868
- uv_fs_copyfile() sets errno on error.
  PR-URL: libuv/libuv#1881
  Fixes: nodejs#21329
- uv_fs_fchmod() supports -A files on Windows.
  PR-URL: libuv/libuv#1819
  Refs: nodejs#12803

PR-URL: nodejs#21466
Reviewed-By: Anna Henningsen <[email protected]>
Reviewed-By: Ben Noordhuis <[email protected]>
Reviewed-By: Santiago Gimeno <[email protected]>
Reviewed-By: James M Snell <[email protected]>
targos pushed a commit that referenced this issue Jun 25, 2018
Notable changes:

- Building via cmake is now supported.
  PR-URL: libuv/libuv#1850
- Stricter checks have been added to prevent watching the same
  file descriptor multiple times.
  PR-URL: libuv/libuv#1851
  Refs: #3604
- An IPC deadlock on Windows has been fixed.
  PR-URL: libuv/libuv#1843
  Fixes: #9706
  Fixes: #7657
- uv_fs_lchown() has been added.
  PR-URL: libuv/libuv#1826
  Refs: #19868
- uv_fs_copyfile() sets errno on error.
  PR-URL: libuv/libuv#1881
  Fixes: #21329
- uv_fs_fchmod() supports -A files on Windows.
  PR-URL: libuv/libuv#1819
  Refs: #12803

PR-URL: #21466
Reviewed-By: Anna Henningsen <[email protected]>
Reviewed-By: Ben Noordhuis <[email protected]>
Reviewed-By: Santiago Gimeno <[email protected]>
Reviewed-By: James M Snell <[email protected]>
MylesBorins pushed a commit that referenced this issue Aug 7, 2018
Notable changes:
- uv_fs_copyfile() adds support for copy-on-write behavior.
- uv_relative_path() now uses the long directory name
  for handle->dirw.
- File operations on files > 2 GB on 32-bit platforms are
  working again.
- uv_fs_fchmod() on Windows works on files with the
  Archive flag cleared.

Fixes: #19170
Fixes: #19455
Fixes: #12803
PR-URL: #19758
Reviewed-By: Ben Noordhuis <[email protected]>
Reviewed-By: Santiago Gimeno <[email protected]>
Reviewed-By: James M Snell <[email protected]>
@refack refack removed their assignment Oct 12, 2018
MylesBorins pushed a commit to MylesBorins/node that referenced this issue Nov 5, 2018
Notable changes:
- uv_fs_copyfile() adds support for copy-on-write behavior.
- uv_relative_path() now uses the long directory name
  for handle->dirw.
- File operations on files > 2 GB on 32-bit platforms are
  working again.
- uv_fs_fchmod() on Windows works on files with the
  Archive flag cleared.

Fixes: nodejs#19170
Fixes: nodejs#19455
Fixes: nodejs#12803
PR-URL: nodejs#19758
Reviewed-By: Ben Noordhuis <[email protected]>
Reviewed-By: Santiago Gimeno <[email protected]>
Reviewed-By: James M Snell <[email protected]>
MylesBorins pushed a commit to MylesBorins/node that referenced this issue Nov 5, 2018
Notable changes:

- Building via cmake is now supported.
  PR-URL: libuv/libuv#1850
- Stricter checks have been added to prevent watching the same
  file descriptor multiple times.
  PR-URL: libuv/libuv#1851
  Refs: nodejs#3604
- An IPC deadlock on Windows has been fixed.
  PR-URL: libuv/libuv#1843
  Fixes: nodejs#9706
  Fixes: nodejs#7657
- uv_fs_lchown() has been added.
  PR-URL: libuv/libuv#1826
  Refs: nodejs#19868
- uv_fs_copyfile() sets errno on error.
  PR-URL: libuv/libuv#1881
  Fixes: nodejs#21329
- uv_fs_fchmod() supports -A files on Windows.
  PR-URL: libuv/libuv#1819
  Refs: nodejs#12803

PR-URL: nodejs#21466
Reviewed-By: Anna Henningsen <[email protected]>
Reviewed-By: Ben Noordhuis <[email protected]>
Reviewed-By: Santiago Gimeno <[email protected]>
Reviewed-By: James M Snell <[email protected]>
MylesBorins pushed a commit that referenced this issue Nov 11, 2018
Notable changes:
- uv_fs_copyfile() adds support for copy-on-write behavior.
- uv_relative_path() now uses the long directory name
  for handle->dirw.
- File operations on files > 2 GB on 32-bit platforms are
  working again.
- uv_fs_fchmod() on Windows works on files with the
  Archive flag cleared.

Backport-PR-URL: #24103
Fixes: #19170
Fixes: #19455
Fixes: #12803
PR-URL: #19758
Reviewed-By: Ben Noordhuis <[email protected]>
Reviewed-By: Santiago Gimeno <[email protected]>
Reviewed-By: James M Snell <[email protected]>
MylesBorins pushed a commit that referenced this issue Nov 11, 2018
Notable changes:

- Building via cmake is now supported.
  PR-URL: libuv/libuv#1850
- Stricter checks have been added to prevent watching the same
  file descriptor multiple times.
  PR-URL: libuv/libuv#1851
  Refs: #3604
- An IPC deadlock on Windows has been fixed.
  PR-URL: libuv/libuv#1843
  Fixes: #9706
  Fixes: #7657
- uv_fs_lchown() has been added.
  PR-URL: libuv/libuv#1826
  Refs: #19868
- uv_fs_copyfile() sets errno on error.
  PR-URL: libuv/libuv#1881
  Fixes: #21329
- uv_fs_fchmod() supports -A files on Windows.
  PR-URL: libuv/libuv#1819
  Refs: #12803

Backport-PR-URL: #24103
PR-URL: #21466
Reviewed-By: Anna Henningsen <[email protected]>
Reviewed-By: Ben Noordhuis <[email protected]>
Reviewed-By: Santiago Gimeno <[email protected]>
Reviewed-By: James M Snell <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
confirmed-bug Issues with confirmed bugs. fs Issues and PRs related to the fs subsystem / file system. libuv Issues and PRs related to the libuv dependency or the uv binding. regression Issues related to regressions. test Issues and PRs related to the tests. windows Issues and PRs related to the Windows platform.
Projects
None yet
Development

Successfully merging a pull request may close this issue.

5 participants