Skip to content

Commit

Permalink
win, fs: use FILE_WRITE_ATTRIBUTES when opening files
Browse files Browse the repository at this point in the history
This allows for running uv_fs_fchmod on files with Archive flag cleared

Refs: nodejs/node#12803
PR-URL: libuv#1777
Reviewed-By: Santiago Gimeno <[email protected]>
Reviewed-By: Colin Ihrig <[email protected]>
  • Loading branch information
bzoz committed Mar 29, 2018
1 parent edf05b9 commit aa1beaa
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/win/fs.c
Original file line number Diff line number Diff line change
Expand Up @@ -434,6 +434,8 @@ void fs__open(uv_fs_t* req) {
access |= FILE_APPEND_DATA;
}

access |= FILE_WRITE_ATTRIBUTES;

/*
* Here is where we deviate significantly from what CRT's _open()
* does. We indiscriminately use all the sharing modes, to match
Expand Down
22 changes: 22 additions & 0 deletions test/test-fs.c
Original file line number Diff line number Diff line change
Expand Up @@ -1367,6 +1367,28 @@ TEST_IMPL(fs_chmod) {

check_permission("test_file", 0600);

#ifdef _WIN32
/* Test clearing read-only flag from files with Archive flag cleared */
/* Make the file read-only and clear archive flag */
r = SetFileAttributes("test_file", FILE_ATTRIBUTE_READONLY);
ASSERT(r != 0);
check_permission("test_file", 0400);

r = uv_fs_open(NULL, &req, "test_file", 0, 0, NULL);
ASSERT(r >= 0);
ASSERT(req.result >= 0);
uv_fs_req_cleanup(&req);

r = uv_fs_fchmod(NULL, &req, file, 0600, NULL);
ASSERT(r == 0);
ASSERT(req.result == 0);
uv_fs_req_cleanup(&req);

check_permission("test_file", 0600);
/* Restore Archive flag for rest of the tests */
r = SetFileAttributes("test_file", FILE_ATTRIBUTE_ARCHIVE);
ASSERT(r != 0);
#endif
#ifndef _WIN32
/* async chmod */
{
Expand Down

0 comments on commit aa1beaa

Please sign in to comment.