diff --git a/src/libraries/System.Private.CoreLib/src/Resources/Strings.resx b/src/libraries/System.Private.CoreLib/src/Resources/Strings.resx index fd58d7afae6074..f0dd0e2b74d1cc 100644 --- a/src/libraries/System.Private.CoreLib/src/Resources/Strings.resx +++ b/src/libraries/System.Private.CoreLib/src/Resources/Strings.resx @@ -1941,7 +1941,7 @@ startIndex cannot be larger than length of string. - Stream length must be non-negative and less than the maximum array length (0x7FFFFFC7) - origin. + Stream length must be non-negative and less than the maximum array length {0} - origin. The length of the buffer must be less than the maximum UIntPtr value for your platform. diff --git a/src/libraries/System.Private.CoreLib/src/System/IO/MemoryStream.cs b/src/libraries/System.Private.CoreLib/src/System/IO/MemoryStream.cs index 05480a61c72b5c..53f717dfe80a4e 100644 --- a/src/libraries/System.Private.CoreLib/src/System/IO/MemoryStream.cs +++ b/src/libraries/System.Private.CoreLib/src/System/IO/MemoryStream.cs @@ -44,6 +44,7 @@ public MemoryStream() public MemoryStream(int capacity) { ArgumentOutOfRangeException.ThrowIfNegative(capacity); + ArgumentOutOfRangeException.ThrowIfGreaterThan(capacity, MemStreamMaxLength); _buffer = capacity != 0 ? new byte[capacity] : Array.Empty(); _capacity = capacity; @@ -311,7 +312,7 @@ public override long Position EnsureNotClosed(); if (value > MemStreamMaxLength - _origin) - throw new ArgumentOutOfRangeException(nameof(value), SR.ArgumentOutOfRange_StreamLength); + throw new ArgumentOutOfRangeException(nameof(value), SR.Format(SR.ArgumentOutOfRange_StreamLength, Array.MaxLength)); _position = _origin + (int)value; } } @@ -524,7 +525,7 @@ public override long Seek(long offset, SeekOrigin loc) private long SeekCore(long offset, int loc) { if (offset > MemStreamMaxLength - loc) - throw new ArgumentOutOfRangeException(nameof(offset), SR.ArgumentOutOfRange_StreamLength); + throw new ArgumentOutOfRangeException(nameof(offset), SR.Format(SR.ArgumentOutOfRange_StreamLength, Array.MaxLength)); int tempPosition = unchecked(loc + (int)offset); if (unchecked(loc + offset) < _origin || tempPosition < _origin) throw new IOException(SR.IO_SeekBeforeBegin); @@ -547,14 +548,14 @@ private long SeekCore(long offset, int loc) public override void SetLength(long value) { if (value < 0 || value > MemStreamMaxLength) - throw new ArgumentOutOfRangeException(nameof(value), SR.ArgumentOutOfRange_StreamLength); + throw new ArgumentOutOfRangeException(nameof(value), SR.Format(SR.ArgumentOutOfRange_StreamLength, Array.MaxLength)); EnsureWriteable(); // Origin wasn't publicly exposed above. - Debug.Assert(MemStreamMaxLength == 0x7FFFFFC7); // Check parameter validation logic in this method if this fails. + Debug.Assert(MemStreamMaxLength == Array.MaxLength); // Check parameter validation logic in this method if this fails. if (value > (MemStreamMaxLength - _origin)) - throw new ArgumentOutOfRangeException(nameof(value), SR.ArgumentOutOfRange_StreamLength); + throw new ArgumentOutOfRangeException(nameof(value), SR.Format(SR.ArgumentOutOfRange_StreamLength, Array.MaxLength)); int newLength = _origin + (int)value; bool allocatedNewArray = EnsureCapacity(newLength); diff --git a/src/libraries/System.Runtime/tests/System.IO.Tests/MemoryStream/MemoryStream.ConstructorTests.cs b/src/libraries/System.Runtime/tests/System.IO.Tests/MemoryStream/MemoryStream.ConstructorTests.cs index c987446b102ef0..6df2689e117704 100644 --- a/src/libraries/System.Runtime/tests/System.IO.Tests/MemoryStream/MemoryStream.ConstructorTests.cs +++ b/src/libraries/System.Runtime/tests/System.IO.Tests/MemoryStream/MemoryStream.ConstructorTests.cs @@ -36,7 +36,7 @@ public static void MemoryStream_Ctor_InvalidCapacities() Assert.Throws(() => new MemoryStream(-1)); if (PlatformDetection.IsNotIntMaxValueArrayIndexSupported) { - Assert.Throws(() => new MemoryStream(int.MaxValue)); + Assert.Throws(() => new MemoryStream(int.MaxValue)); } } }