Skip to content

Commit d1f043d

Browse files
committed
PR feedback.
1 parent bc7383b commit d1f043d

File tree

7 files changed

+58
-21
lines changed

7 files changed

+58
-21
lines changed

src/libraries/System.Formats.Tar/src/System/Formats/Tar/TarEntry.Unix.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,7 @@ partial void SetModeOnFile(SafeFileHandle handle, string destinationFileName)
5454
// If the permissions weren't set at all, don't write the file's permissions.
5555
if (permissions != 0)
5656
{
57-
#pragma warning disable CA1416 // Validate platform compatibility
5857
File.SetUnixFileMode(handle, (UnixFileMode)permissions);
59-
#pragma warning disable CA1416
6058
}
6159
}
6260
}

src/libraries/System.IO.FileSystem/tests/Base/BaseGetSetUnixFileMode.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public abstract class BaseGetSetUnixFileMode : FileSystemTest
1414
// When false, the Get API returns (UnixFileMode)(-1) when the file doesn't exist.
1515
protected virtual bool GetThrowsWhenDoesntExist => false;
1616

17-
// The FileSafeHandle APIs require a readable file to open the handle.
17+
// The SafeFileHandle APIs require a readable file to open the handle.
1818
protected virtual bool GetModeNeedsReadableFile => false;
1919

2020
// When false, the Get API returns (UnixFileMode)(-1) when the platform is not supported (Windows).
@@ -57,7 +57,7 @@ public void Get()
5757
UnixFileMode required = UnixFileMode.UserRead | UnixFileMode.UserWrite;
5858
if (IsDirectory)
5959
{
60-
required = UnixFileMode.UserExecute;
60+
required |= UnixFileMode.UserExecute;
6161
}
6262
Assert.True((mode & required) == required);
6363

src/libraries/System.IO.FileSystem/tests/Directory/CreateDirectory_UnixFileMode.Unix.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,24 +19,24 @@ public override DirectoryInfo Create(string path)
1919
public void CreateWithUnixFileMode(UnixFileMode mode)
2020
{
2121
string path = GetRandomDirPath();
22-
DirectoryInfo di = Directory.CreateDirectory(path, mode);
22+
DirectoryInfo dir = Directory.CreateDirectory(path, mode);
2323

2424
// under Linux the created directory gets mode (mode & ~umask & 01777).
2525
// under OSX, it gets (mode & ~umask & 0777).
2626
UnixFileMode platformFilter = UnixFileMode.SetGroup | UnixFileMode.SetUser | (PlatformDetection.IsBsdLike ? UnixFileMode.StickyBit : UnixFileMode.None);
2727
UnixFileMode expectedMode = mode & ~GetUmask() & ~platformFilter;
28-
Assert.Equal(expectedMode, di.UnixFileMode);
28+
Assert.Equal(expectedMode, dir.UnixFileMode);
2929
}
3030

3131
[Fact]
3232
public void CreateDoesntChangeExistingMode()
3333
{
3434
string path = GetRandomDirPath();
35-
DirectoryInfo di = Directory.CreateDirectory(path, AllAccess);
36-
UnixFileMode initialMode = di.UnixFileMode;
35+
DirectoryInfo dir = Directory.CreateDirectory(path, AllAccess);
36+
UnixFileMode initialMode = dir.UnixFileMode;
3737

38-
DirectoryInfo di2 = Directory.CreateDirectory(path, UnixFileMode.UserRead);
39-
Assert.Equal(initialMode, di2.UnixFileMode);
38+
DirectoryInfo sameDir = Directory.CreateDirectory(path, UnixFileMode.UserRead);
39+
Assert.Equal(initialMode, sameDir.UnixFileMode);
4040
}
4141

4242
[Theory]

src/libraries/System.IO.FileSystem/tests/FileStream/FileStreamOptions.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -199,12 +199,16 @@ static void Validate(FileStream fs, string expectedPath, bool expectedAsync, boo
199199
}
200200
}
201201

202-
[PlatformSpecific(TestPlatforms.Windows)]
203202
[Fact]
204-
public void UnixCreateMode_Unsupported()
203+
public void UnixCreateModeDefaultsToNull()
205204
{
206205
Assert.Null(new FileStreamOptions().UnixCreateMode);
206+
}
207207

208+
[PlatformSpecific(TestPlatforms.Windows)]
209+
[Fact]
210+
public void UnixCreateMode_Unsupported()
211+
{
208212
Assert.Throws<PlatformNotSupportedException>(() => new FileStreamOptions { UnixCreateMode = null });
209213
Assert.Throws<PlatformNotSupportedException>(() => new FileStreamOptions { UnixCreateMode = UnixFileMode.None });
210214
Assert.Throws<PlatformNotSupportedException>(() => new FileStreamOptions { UnixCreateMode = UnixFileMode.UserRead });
@@ -214,8 +218,6 @@ public void UnixCreateMode_Unsupported()
214218
[Fact]
215219
public void UnixCreateMode_Supported()
216220
{
217-
Assert.Null(new FileStreamOptions().UnixCreateMode);
218-
219221
Assert.Null(new FileStreamOptions { UnixCreateMode = null }.UnixCreateMode);
220222
Assert.Equal(UnixFileMode.None, new FileStreamOptions { UnixCreateMode = UnixFileMode.None }.UnixCreateMode);
221223
Assert.Equal(UnixFileMode.UserRead, new FileStreamOptions { UnixCreateMode = UnixFileMode.UserRead }.UnixCreateMode);

src/libraries/System.IO.FileSystem/tests/FileStream/ctor_options.Unix.cs

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ namespace System.IO.Tests
99
{
1010
public partial class FileStream_ctor_options
1111
{
12-
[PlatformSpecific(TestPlatforms.AnyUnix)]
1312
[Theory]
1413
[MemberData(nameof(TestUnixFileModes))]
1514
public void CreateWithUnixFileMode(UnixFileMode mode)
@@ -26,22 +25,48 @@ public void CreateWithUnixFileMode(UnixFileMode mode)
2625
Assert.Equal(expectedMode, actualMode);
2726
}
2827

29-
[PlatformSpecific(TestPlatforms.AnyUnix)]
30-
[Fact]
31-
public void CreateDoesntChangeExistingMode()
28+
[Theory]
29+
[InlineData(FileMode.Append)]
30+
[InlineData(FileMode.Create)]
31+
[InlineData(FileMode.OpenOrCreate)]
32+
public void CreateDoesntChangeExistingUnixFileMode(FileMode fileMode)
3233
{
3334
// Create file as writable for user only.
3435
const UnixFileMode mode = UnixFileMode.UserWrite;
3536
string filename = GetTestFilePath();
36-
using FileStream fs = CreateFileStream(filename, FileMode.CreateNew, FileAccess.Write, FileShare.None, bufferSize: 1, FileOptions.None, preallocationSize: 0, mode);
37-
fs.Dispose();
37+
CreateFileStream(filename, FileMode.CreateNew, FileAccess.Write, FileShare.None, bufferSize: 1, FileOptions.None, preallocationSize: 0, mode).Dispose();
3838

3939
// Now open with AllAccess.
40-
using FileStream fs2 = CreateFileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None, bufferSize: 1, FileOptions.None, preallocationSize: 0, AllAccess);
40+
using FileStream fs = CreateFileStream(filename, fileMode, FileAccess.Write, FileShare.None, bufferSize: 1, FileOptions.None, preallocationSize: 0, AllAccess);
4141
UnixFileMode actualMode = File.GetUnixFileMode(filename);
4242
Assert.Equal(mode, actualMode);
4343
}
4444

45+
[Theory]
46+
[InlineData(FileMode.Append, true)]
47+
[InlineData(FileMode.Create, true)]
48+
[InlineData(FileMode.CreateNew, true)]
49+
[InlineData(FileMode.OpenOrCreate, true)]
50+
[InlineData(FileMode.Truncate, false)]
51+
[InlineData(FileMode.Open, false)]
52+
public void UnixCreateModeThrowsForNonCreatingFileModes(FileMode fileMode, bool canSetUnixCreateMode)
53+
{
54+
const UnixFileMode unixMode = UnixFileMode.UserWrite;
55+
string filename = GetTestFilePath();
56+
57+
if (canSetUnixCreateMode)
58+
{
59+
CreateFileStream(filename, fileMode, FileAccess.Write, FileShare.None, bufferSize: 1, FileOptions.None, preallocationSize: 0, unixMode).Dispose();
60+
61+
UnixFileMode actualMode = File.GetUnixFileMode(filename);
62+
Assert.Equal(unixMode, actualMode);
63+
}
64+
else
65+
{
66+
Assert.Throws<ArgumentException>(() => CreateFileStream(filename, fileMode, FileAccess.Write, FileShare.None, bufferSize: 1, FileOptions.None, preallocationSize: 0, unixMode));
67+
}
68+
}
69+
4570
private static long GetAllocatedSize(FileStream fileStream)
4671
{
4772
bool isOSX = RuntimeInformation.IsOSPlatform(OSPlatform.OSX);

src/libraries/System.Private.CoreLib/src/Resources/Strings.resx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1098,6 +1098,9 @@
10981098
<data name="Argument_InvalidPreallocateMode" xml:space="preserve">
10991099
<value>Preallocation size can be requested only for new files.</value>
11001100
</data>
1101+
<data name="Argument_InvalidUnixCreateMode" xml:space="preserve">
1102+
<value>UnixCreateMode can be requested only for modes that can new files.</value>
1103+
</data>
11011104
<data name="Argument_InvalidArgumentForComparison" xml:space="preserve">
11021105
<value>Type of argument is not compatible with the generic comparer.</value>
11031106
</data>

src/libraries/System.Private.CoreLib/src/System/IO/FileStream.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,15 @@ public FileStream(string path, FileStreamOptions options)
200200
FileStreamHelpers.ValidateArgumentsForPreallocation(options.Mode, options.Access);
201201
}
202202

203+
if (options.UnixCreateMode.HasValue)
204+
{
205+
// Only allow UnixCreateMode for file modes that can create a new file.
206+
if (options.Mode == FileMode.Truncate || options.Mode == FileMode.Open)
207+
{
208+
throw new ArgumentException(SR.Argument_InvalidUnixCreateMode, nameof(options));
209+
}
210+
}
211+
203212
FileStreamHelpers.SerializationGuard(options.Access);
204213

205214
_strategy = FileStreamHelpers.ChooseStrategy(

0 commit comments

Comments
 (0)