-
Couldn't load subscription status.
- Fork 5.2k
Description
Description
RandomAccess.Write(SafeFileHandle handle, IReadOnlyList<ReadOnlyMemory<byte>> buffers, long fileOffset) throws IOException on Windows platform when the bytes in the buffers list exceed Int32.MaxValue
Here's the relevant stack trace
System.IO.IOException: The parameter is incorrect.
at System.IO.RandomAccess.WriteAtOffset(SafeFileHandle handle, ReadOnlySpan`1 buffer, Int64 fileOffset)
at System.IO.RandomAccess.WriteGatherAtOffset(SafeFileHandle handle, IReadOnlyList`1 buffers, Int64 fileOffset)
I suspect the problem is in the bytesWritten variable, because it is int and it overflows
runtime/src/libraries/System.Private.CoreLib/src/System/IO/RandomAccess.Windows.cs
Lines 435 to 446 in 01aa3d9
| internal static void WriteGatherAtOffset(SafeFileHandle handle, IReadOnlyList<ReadOnlyMemory<byte>> buffers, long fileOffset) | |
| { | |
| // WriteFileGather does not support sync handles, so we just call WriteFile in a loop | |
| int bytesWritten = 0; | |
| int buffersCount = buffers.Count; | |
| for (int i = 0; i < buffersCount; i++) | |
| { | |
| ReadOnlySpan<byte> span = buffers[i].Span; | |
| WriteAtOffset(handle, span, fileOffset + bytesWritten); | |
| bytesWritten += span.Length; | |
| } | |
| } |
Reproduction Steps
Just call RandomAccess.Write(handle, buffers, 0) on Windows machine where buffers parameter contains multiple ReadOnlyMemory<byte> buffers that collectively are larger than 2GB
Expected behavior
It should save the buffers to the file and not throw IOException
Actual behavior
throws System.IO.IOException: The parameter is incorrect.
Regression?
Haven't tried it on .NET 6
Known Workarounds
I guess you can split the buffers in multiple smaller lists and call the method multiple times
Configuration
Which version of .NET is the code running on?
.NET 7
What OS and version, and what distro if applicable?
Windows 10
What is the architecture (x64, x86, ARM, ARM64)?
x64
Do you know whether it is specific to that configuration?
I believe the problem is in the Windows implementation only
Other information
No response