This is Xamarin's bug tracking system. For product support, please use the support links listed in your Xamarin Account.
Bug 48516 - ZipArchive.Save attempts to set position and seek non-seekable streams
Summary: ZipArchive.Save attempts to set position and seek non-seekable streams
Status: RESOLVED FIXED
Alias: None
Product: Class Libraries
Classification: Mono
Component: Other (show other bugs)
Version: 4.6.0 (C8)
Hardware: PC Linux
: --- normal
Target Milestone: ---
Assignee: Bugzilla
URL:
Depends on:
Blocks:
 
Reported: 2016-12-01 11:57 UTC by peter
Modified: 2016-12-20 20:55 UTC (History)
2 users (show)

See Also:
Tags:
Is this bug a regression?: ---
Last known good build:


Attachments

Description peter 2016-12-01 11:57:26 UTC
Looking at https://github.com/mono/mono/blob/master/mcs/class/System.IO.Compression/ZipArchive.cs#L228 you can see that Save will always attempt to set Length and Position to 0 as part of a save. This happens regardless of the mode selected. So if your stream is non-seekable, you cannot use it to create a ziparchive  (without using and intermediate memorystream).

A similar problem existed in .NET Core, but has recently been fixed:
https://github.com/dotnet/corefx/issues/11497

The bug can be easily reproduced with the following:

using System;
using System.IO;
using System.IO.Compression;

namespace SeekeableStreamBug {
  public class NonSeekableMemoryStream: MemoryStream {
    public override bool CanSeek => false;

    public override long Position {
      get { throw new NotSupportedException(); }
      set { throw new NotSupportedException(); }
    }

    public override long Length {
      get { throw new NotSupportedException(); }
      set { throw new NotSupportedException(); }
    }
  }

  public class Program {
    public static void Main( string[] args ) {
      using ( ZipArchive archive = new ZipArchive( new NonSeekableMemoryStream(), ZipArchiveMode.Create, false ) ) {
        var entry = archive.CreateEntry( "foo" );
        using ( var es = entry.Open() ) {
          es.Write( new byte[] { 4, 2 }, 0, 2 );
        }
      }
    }
  }
}
Comment 1 Alexander Köplinger [MSFT] 2016-12-20 20:55:41 UTC
Fixed by https://github.com/mono/mono/pull/4118, thank you!

Note You need to log in before you can comment on or make changes to this bug.