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
|
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
Description
RandomAccess.Write(SafeFileHandle handle, IReadOnlyList<ReadOnlyMemory<byte>> buffers, long fileOffset)throwsIOExceptionon Windows platform when the bytes in thebufferslist exceedInt32.MaxValueHere's the relevant stack trace
I suspect the problem is in the
bytesWrittenvariable, because it isintand it overflowsruntime/src/libraries/System.Private.CoreLib/src/System/IO/RandomAccess.Windows.cs
Lines 435 to 446 in 01aa3d9
Reproduction Steps
Just call RandomAccess.Write(handle, buffers, 0) on Windows machine where
buffersparameter contains multipleReadOnlyMemory<byte>buffers that collectively are larger than 2GBExpected 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