authorgravatar for jan.hafer@rwth-aachen.deJan Philipp Hafer <jan.hafer@rwth-aachen.de> 2023-05-01 18:22:28+02:00
committergravatar for jan.hafer@rwth-aachen.deJan Philipp Hafer <jan.hafer@rwth-aachen.de> 2023-05-01 18:22:28+02:00
log7594d2c0977497c81db0c394f775832689bad492
treeb1088f40e4272f1da6633f9cd01b02948b3941ab
parentbe50dbf1ce03f5dc5deef86882ab3505363b683a

address review by user @squeek502


2 files changed, 38 insertions(+), 22 deletions(-)

lib/std/fs/test.zig+27-8
......@@ -1416,23 +1416,42 @@ test "File.PermissionsUnix" {
14161416 try testing.expect(!permissions_unix.unixHas(.other, .execute));
14171417}
14181418
1419test "delete a read-only file on windows" {
1420 if (builtin.os.tag != .windows) return error.SkipZigTest;
1419test "delete a read-only file on windows with file pending semantics" {
1420 if (builtin.os.tag != .windows or builtin.target.os.version_range.windows.min.isAtLeast(.win10_rs1))
1421 return error.SkipZigTest;
1422
1423 var tmp = tmpDir(.{});
1424 defer tmp.cleanup();
1425 {
1426 const file = try tmp.dir.createFile("test_file", .{ .read = true });
1427 defer file.close();
1428 // Create a file and make it read-only
1429 const metadata = try file.metadata();
1430 var permissions = metadata.permissions();
1431 permissions.setReadOnly(true);
1432 try file.setPermissions(permissions);
1433 try testing.expectError(error.AccessDenied, tmp.dir.deleteFile("test_file"));
1434 // Now make the file not read-only
1435 permissions.setReadOnly(false);
1436 try file.setPermissions(permissions);
1437 }
1438 try tmp.dir.deleteFile("test_file");
1439}
1440
1441test "delete a read-only file on windows with posix semantis" {
1442 if (builtin.os.tag != .windows or !builtin.target.os.version_range.windows.min.isAtLeast(.win10_rs1))
1443 return error.SkipZigTest;
14211444
14221445 var tmp = tmpDir(.{});
14231446 defer tmp.cleanup();
14241447 const file = try tmp.dir.createFile("test_file", .{ .read = true });
1448 defer file.close();
14251449 // Create a file and make it read-only
14261450 const metadata = try file.metadata();
14271451 var permissions = metadata.permissions();
14281452 permissions.setReadOnly(true);
14291453 try file.setPermissions(permissions);
1430 try testing.expectError(error.AccessDenied, tmp.dir.deleteFile("test_file"));
1431 // Now make the file not read-only
1432 permissions.setReadOnly(false);
1433 try file.setPermissions(permissions);
1434 file.close();
1435 try tmp.dir.deleteFile("test_file");
1454 try tmp.dir.deleteFile("test_file"); // file is unmapped and deleted once last handle closed
14361455}
14371456
14381457test "delete a setAsCwd directory on Windows" {
lib/std/os/windows.zig+11-14
......@@ -938,6 +938,7 @@ pub fn DeleteFile(sub_path_w: []const u16, options: DeleteFileOptions) DeleteFil
938938 else => return unexpectedStatus(rc),
939939 }
940940 defer CloseHandle(tmp_handle);
941
941942 if (comptime builtin.target.os.version_range.windows.min.isAtLeast(.win10_rs1)) {
942943 // Deletion with posix semantics.
943944 var info = FILE_DISPOSITION_INFORMATION_EX{
......@@ -953,17 +954,13 @@ pub fn DeleteFile(sub_path_w: []const u16, options: DeleteFileOptions) DeleteFil
953954 @sizeOf(FILE_DISPOSITION_INFORMATION_EX),
954955 .FileDispositionInformationEx,
955956 );
956 switch (rc) {
957 .SUCCESS => {},
958 .CANNOT_DELETE => return error.FileBusy, // file is currently mapped
959 else => return unexpectedStatus(rc),
960 }
961957 } else {
962958 // Deletion with file pending semantics, which requires waiting or moving
963959 // files to get them removed (from here).
964960 var file_dispo = FILE_DISPOSITION_INFORMATION{
965961 .DeleteFile = TRUE,
966962 };
963
967964 rc = ntdll.NtSetInformationFile(
968965 tmp_handle,
969966 &io,
......@@ -971,15 +968,15 @@ pub fn DeleteFile(sub_path_w: []const u16, options: DeleteFileOptions) DeleteFil
971968 @sizeOf(FILE_DISPOSITION_INFORMATION),
972969 .FileDispositionInformation,
973970 );
974 switch (rc) {
975 .SUCCESS => {},
976 .DIRECTORY_NOT_EMPTY => return error.DirNotEmpty,
977 .INVALID_PARAMETER => unreachable,
978 .CANNOT_DELETE => return error.AccessDenied,
979 .MEDIA_WRITE_PROTECTED => return error.AccessDenied,
980 .ACCESS_DENIED => return error.AccessDenied,
981 else => return unexpectedStatus(rc),
982 }
971 }
972 switch (rc) {
973 .SUCCESS => {},
974 .DIRECTORY_NOT_EMPTY => return error.DirNotEmpty,
975 .INVALID_PARAMETER => unreachable,
976 .CANNOT_DELETE => return error.AccessDenied,
977 .MEDIA_WRITE_PROTECTED => return error.AccessDenied,
978 .ACCESS_DENIED => return error.AccessDenied,
979 else => return unexpectedStatus(rc),
983980 }
984981}
985982