Skip to content

Unexpected crashes in SetData method of ExtendedUnixData #887

@reuterma24

Description

@reuterma24

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 to count

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions