Skip to content

Commit f82e07e

Browse files
committed
prevent cross-process write to profile file
1 parent 2d06c68 commit f82e07e

File tree

1 file changed

+15
-11
lines changed

1 file changed

+15
-11
lines changed

src/Accounts/Authentication.ResourceManager/ProtectedFileProvider.cs

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,18 @@ public abstract class ProtectedFileProvider : IFileProvider, IDisposable
3636
public const int MaxTries = 30;
3737
static readonly TimeSpan RetryInterval = TimeSpan.FromMilliseconds(500);
3838
protected Stream _stream;
39-
object _initializationLock = new object();
39+
40+
/// <summary>
41+
/// Use a Mutex to prevent cross-process file I/O
42+
/// </summary>
43+
/// <returns></returns>
44+
private static readonly Mutex _initializationLock = new Mutex(false, @"Global\AzurePowerShellProtectedFileProviderInit");
4045
public string FilePath { get; set; }
4146

4247
protected IDataStore DataStore { get; set; }
4348

4449
/// <summary>
45-
///
50+
///
4651
/// </summary>
4752
public Stream Stream
4853
{
@@ -87,18 +92,17 @@ public StreamWriter CreateWriter()
8792

8893
protected virtual void InitializeStream()
8994
{
90-
lock (_initializationLock)
95+
_initializationLock.WaitOne();
96+
if (_stream == null)
9197
{
92-
if (_stream == null)
98+
Stream stream;
99+
if (!TryGetStreamLock(AcquireLock, FilePath, out stream))
93100
{
94-
Stream stream;
95-
if (!TryGetStreamLock(AcquireLock, FilePath, out stream))
96-
{
97-
throw new UnauthorizedAccessException(string.Format(Resources.FileLockFailure, FilePath));
98-
}
99-
100-
_stream = stream;
101+
_initializationLock.ReleaseMutex();
102+
throw new UnauthorizedAccessException(string.Format(Resources.FileLockFailure, FilePath));
101103
}
104+
_initializationLock.ReleaseMutex();
105+
_stream = stream;
102106
}
103107
}
104108

0 commit comments

Comments
 (0)