Open miroslavp opened 2 days ago
Tagging subscribers to this area: @dotnet/area-system-io See info in area-owners.md if you want to be subscribed.
This is not a regression, because RandomAccess.Write was added in .NET 6.0.0, where it already uses the wrong type in int bytesWritten
: https://github.com/dotnet/runtime/blob/4822e3c3aa77eb82b2fb33c9321f923cf11ddde6/src/libraries/System.Private.CoreLib/src/System/IO/RandomAccess.Windows.cs#L408-L419
RandomAccess.Read does not have a similar bug; there, RandomAccess.ReadScatterAtOffset correctly uses long total
.
I think the buggy WriteGatherAtOffset can also silently write to the wrong offset and thus corrupt the file, if the fileOffset
parameter is already greater than Int32.MaxValue
; then the sum fileOffset + bytesWritten
won't be negative and won't cause IOException.
@miroslavp thank you for a detailed bug report. You are right, it's a bug. Since you have found the place that requires the fix, would you like to send a PR with a fix?
Description
RandomAccess.Write(SafeFileHandle handle, IReadOnlyList<ReadOnlyMemory<byte>> buffers, long fileOffset)
throwsIOException
on Windows platform when the bytes in thebuffers
list exceedInt32.MaxValue
Here's the relevant stack trace
I suspect the problem is in the
bytesWritten
variable, because it isint
and it overflowshttps://github.com/dotnet/runtime/blob/01aa3d96bb2160144f167b1065e081521d133b48/src/libraries/System.Private.CoreLib/src/System/IO/RandomAccess.Windows.cs#L435-L446
Reproduction Steps
Just call RandomAccess.Write(handle, buffers, 0) on Windows machine where
buffers
parameter 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