-
Notifications
You must be signed in to change notification settings - Fork 996
Description
Describe the bug
Hi :)
The SetData method in Zip/ZipExtraData.cs
crashes with a System.IO.EndOfStreamException
in two specific scenarios:
- when
count
is set to 0 - when
index
is equal tocount
In both cases, the documentation does not indicate that these inputs are invalid.
I think, based on the documentation and signature, one would expect no operation to occur for these cases, as there is no data to process.
Steps to reproduce
The following two test cases can be used to demonstrate the behavior.
As of right now, they would both fail.
[Test]
public void SetDataCountZero()
{
var extendedUnixData = new ExtendedUnixData();
byte[] data = new byte[] { 1, 2, 3, 4 };
int index = 0;
int count = 0; // Nothing available to be read
Assert.DoesNotThrow(() => extendedUnixData.SetData(data, index, count));
}
[Test]
public void SetDataOffsetAndCountEqual()
{
var extendedUnixData = new ExtendedUnixData();
byte[] data = new byte[] { 1, 2, 3, 4 };
int index = 4;
int count = 4;
Assert.DoesNotThrow(() => extendedUnixData.SetData(data, index, count));
}
Expected behavior
I would expect the method to handle this gracefully and perform no operation.
I recommend that either,
1. the implementation is updated to handle these edge cases (e.g. return without reading from stream)
or
2. the documentation is adjusted to explicitly describe these constraints.
For 1., a simple check paired with an early return would do the trick:
/// <summary>
/// Set the data from the raw values provided.
/// </summary>
/// <param name = "data">The raw data to extract values from.</param>
/// <param name = "index">The index to start extracting values from.</param>
/// <param name = "count">The number of bytes available.</param>
public void SetData(byte[] data, int index, int count)
{
if (count == 0 || index == count)
return;
using (MemoryStream ms = new MemoryStream(data, index, count, false))
{ ... }
}
Operating System
macOS
Framework Version
.NET 6
Tags
ZIP
Additional context
No response