From: Roman Marusyk Date: Tue, 23 Feb 2021 18:42:57 +0000 (+0200) Subject: Throw an ObjectDisposedException instead of InvalidOperationException after Process... X-Git-Tag: submit/tizen/20210909.063632~3069 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d99ddd0699dc209714ca8d5e9ff1f5706604911a;p=platform%2Fupstream%2Fdotnet%2Fruntime.git Throw an ObjectDisposedException instead of InvalidOperationException after Process object has been disposed (#46593) fixes #45149 --- diff --git a/src/libraries/System.Diagnostics.Process/src/Resources/Strings.resx b/src/libraries/System.Diagnostics.Process/src/Resources/Strings.resx index 6aa5781..c3877c0 100644 --- a/src/libraries/System.Diagnostics.Process/src/Resources/Strings.resx +++ b/src/libraries/System.Diagnostics.Process/src/Resources/Strings.resx @@ -332,4 +332,4 @@ sysctl {0} failed with {1} error. - + \ No newline at end of file diff --git a/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/Process.cs b/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/Process.cs index 9c54062..9789c2b 100644 --- a/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/Process.cs +++ b/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/Process.cs @@ -683,6 +683,7 @@ namespace System.Diagnostics { get { + CheckDisposed(); if (_standardInput == null) { throw new InvalidOperationException(SR.CantGetStandardIn); @@ -700,6 +701,7 @@ namespace System.Diagnostics { get { + CheckDisposed(); if (_standardOutput == null) { throw new InvalidOperationException(SR.CantGetStandardOut); @@ -725,6 +727,7 @@ namespace System.Diagnostics { get { + CheckDisposed(); if (_standardError == null) { throw new InvalidOperationException(SR.CantGetStandardError); @@ -1150,10 +1153,7 @@ namespace System.Diagnostics if (!_haveProcessHandle) { //Cannot open a new process handle if the object has been disposed, since finalization has been suppressed. - if (_disposed) - { - throw new ObjectDisposedException(GetType().Name); - } + CheckDisposed(); SetProcessHandle(GetProcessHandle()); } @@ -1224,10 +1224,7 @@ namespace System.Diagnostics } //Cannot start a new process and store its handle if the object has been disposed, since finalization has been suppressed. - if (_disposed) - { - throw new ObjectDisposedException(GetType().Name); - } + CheckDisposed(); SerializationGuard.ThrowIfDeserializationInProgress("AllowProcessCreation", ref s_cachedSerializationSwitch); @@ -1586,6 +1583,7 @@ namespace System.Diagnostics /// public void CancelOutputRead() { + CheckDisposed(); if (_output != null) { _output.CancelOperation(); @@ -1606,6 +1604,7 @@ namespace System.Diagnostics /// public void CancelErrorRead() { + CheckDisposed(); if (_error != null) { _error.CancelOperation(); @@ -1656,6 +1655,16 @@ namespace System.Diagnostics } } + /// Throws a System.ObjectDisposedException if the Proces was disposed + /// If the Proces has been disposed. + private void CheckDisposed() + { + if (_disposed) + { + throw new ObjectDisposedException(GetType().Name); + } + } + /// /// This enum defines the operation mode for redirected process stream. /// We don't support switching between synchronous mode and asynchronous mode. diff --git a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.cs b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.cs index d892f52..f97ba57 100644 --- a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.cs +++ b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.cs @@ -1468,6 +1468,56 @@ namespace System.Diagnostics.Tests } [Fact] + public void StandardInput_Disposed_ThrowsObjectDisposedException() + { + var process = new Process(); + process.StartInfo.FileName = "Nothing"; + process.Dispose(); + + Assert.Throws(() => process.StandardInput); + } + + [Fact] + public void StandardError_Disposed_ThrowsObjectDisposedException() + { + var process = new Process(); + process.StartInfo.FileName = "Nothing"; + process.Dispose(); + + Assert.Throws(() => process.StandardError); + } + + [Fact] + public void StandardOutput_Disposed_ThrowsObjectDisposedException() + { + var process = new Process(); + process.StartInfo.FileName = "Nothing"; + process.Dispose(); + + Assert.Throws(() => process.StandardOutput); + } + + [Fact] + public void CancelOutputRead_Disposed_ThrowsObjectDisposedException() + { + var process = new Process(); + process.StartInfo.FileName = "Nothing"; + process.Dispose(); + + Assert.Throws(() => process.CancelOutputRead()); + } + + [Fact] + public void CancelErrorRead_Disposed_ThrowsObjectDisposedException() + { + var process = new Process(); + process.StartInfo.FileName = "Nothing"; + process.Dispose(); + + Assert.Throws(() => process.CancelErrorRead()); + } + + [Fact] [PlatformSpecific(TestPlatforms.Linux | TestPlatforms.Windows)] // Expected process HandleCounts differs on OSX public void TestHandleCount() {