Skip to content
This repository was archived by the owner on Jan 23, 2023. It is now read-only.

Commit 041672f

Browse files
committed
Fix sharing violations caused by FileShare.Inherited
The FileShareOpen test has been failing sporadically with sharing violations. It turns out the problem has to do with FileShare.Inheritable being included in the list of FileShare values to test. If another test in the same process concurrently spawns a process while a FileShare.Inheritable file is open, that file's handle will be inherited into the child process, which will in turn keep the file in use for longer than the test expects. When it then tries to re-open the file, it may encounter a sharing violation if the subsequent open is incompatible with the previous one's FileShare.
1 parent 3331cda commit 041672f

File tree

4 files changed

+33
-12
lines changed

4 files changed

+33
-12
lines changed

src/System.IO.FileSystem/tests/File/Open.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,12 @@ public class File_Open_str_fm_fa_fs : FileStream_ctor_str_fm_fa_fs
3232
{
3333
protected override FileStream CreateFileStream(string path, FileMode mode)
3434
{
35-
return File.Open(path, mode, mode == FileMode.Append ? FileAccess.Write : FileAccess.ReadWrite, FileShare.ReadWrite | FileShare.Delete | FileShare.Inheritable);
35+
return File.Open(path, mode, mode == FileMode.Append ? FileAccess.Write : FileAccess.ReadWrite, FileShare.ReadWrite | FileShare.Delete);
3636
}
3737

3838
protected override FileStream CreateFileStream(string path, FileMode mode, FileAccess access)
3939
{
40-
return File.Open(path, mode, access, FileShare.ReadWrite | FileShare.Delete | FileShare.Inheritable);
40+
return File.Open(path, mode, access, FileShare.ReadWrite | FileShare.Delete);
4141
}
4242

4343
protected override FileStream CreateFileStream(string path, FileMode mode, FileAccess access, FileShare share)

src/System.IO.FileSystem/tests/FileInfo/Open.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,12 +65,12 @@ public class FileInfo_Open_fm_fa_fs : FileStream_ctor_str_fm_fa_fs
6565
{
6666
protected override FileStream CreateFileStream(string path, FileMode mode)
6767
{
68-
return new FileInfo(path).Open(mode, mode == FileMode.Append ? FileAccess.Write : FileAccess.ReadWrite, FileShare.ReadWrite | FileShare.Delete | FileShare.Inheritable);
68+
return new FileInfo(path).Open(mode, mode == FileMode.Append ? FileAccess.Write : FileAccess.ReadWrite, FileShare.ReadWrite | FileShare.Delete);
6969
}
7070

7171
protected override FileStream CreateFileStream(string path, FileMode mode, FileAccess access)
7272
{
73-
return new FileInfo(path).Open(mode, access, FileShare.ReadWrite | FileShare.Delete | FileShare.Inheritable);
73+
return new FileInfo(path).Open(mode, access, FileShare.ReadWrite | FileShare.Delete);
7474
}
7575

7676
protected override FileStream CreateFileStream(string path, FileMode mode, FileAccess access, FileShare share)

src/System.IO.FileSystem/tests/FileStream/ctor_str_fm.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,12 @@
22
// The .NET Foundation licenses this file to you under the MIT license.
33
// See the LICENSE file in the project root for more information.
44

5-
using System;
6-
using System.IO;
5+
using System.Diagnostics;
76
using Xunit;
87

98
namespace System.IO.Tests
109
{
11-
public class FileStream_ctor_str_fm : FileSystemTest
10+
public class FileStream_ctor_str_fm : RemoteExecutorTestBase
1211
{
1312
protected virtual FileStream CreateFileStream(string path, FileMode mode)
1413
{

src/System.IO.FileSystem/tests/FileStream/ctor_str_fm_fa_fs.cs

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,14 @@ public void InvalidShareThrows()
2323
private static readonly FileShare[] s_shares =
2424
{
2525
FileShare.None,
26-
FileShare.Inheritable,
27-
FileShare.Delete, FileShare.Delete | FileShare.Inheritable,
28-
FileShare.Read, FileShare.Read | FileShare.Inheritable, FileShare.Read | FileShare.Delete, FileShare.Read | FileShare.Delete | FileShare.Inheritable,
29-
FileShare.Write, FileShare.Write | FileShare.Inheritable, FileShare.Write | FileShare.Delete, FileShare.Write | FileShare.Delete | FileShare.Inheritable,
30-
FileShare.ReadWrite, FileShare.ReadWrite | FileShare.Inheritable, FileShare.ReadWrite | FileShare.Delete, FileShare.ReadWrite | FileShare.Delete | FileShare.Inheritable
26+
FileShare.Delete,
27+
FileShare.Read, FileShare.Read | FileShare.Delete,
28+
FileShare.Write, FileShare.Write | FileShare.Delete,
29+
FileShare.ReadWrite, FileShare.ReadWrite | FileShare.Delete
30+
31+
// Does not include FileShare.Inheritable, as doing so when other tests concurrently spawn processes
32+
// results in those file handles being inherited, which then keeps the file open longer
33+
// than expected by the test, resulting in subsequent sharing violations.
3134
};
3235

3336
[Fact]
@@ -54,6 +57,25 @@ public void FileShareOpen()
5457
}
5558
}
5659

60+
[Fact]
61+
public void FileShareOpen_Inheritable()
62+
{
63+
RemoteInvoke(() =>
64+
{
65+
int i = 0;
66+
foreach (FileAccess access in new[] { FileAccess.ReadWrite, FileAccess.Write, FileAccess.Read })
67+
{
68+
foreach (FileShare share in s_shares)
69+
{
70+
string fileName = GetTestFilePath(i++);
71+
CreateFileStream(fileName, FileMode.CreateNew, FileAccess.ReadWrite, FileShare.ReadWrite | FileShare.Delete).Dispose();
72+
CreateFileStream(fileName, FileMode.Open, access, share | FileShare.Inheritable).Dispose();
73+
}
74+
}
75+
return SuccessExitCode;
76+
}).Dispose();
77+
}
78+
5779
[Fact]
5880
public void FileShareCreate()
5981
{

0 commit comments

Comments
 (0)