int UnmanagedRead (IntPtr buffer, int length)
{
- int total = 0;
- int n = 1;
- while (length > 0 && n > 0) {
- if (io_buffer == null)
- io_buffer = new byte [BufferSize];
+ if (io_buffer == null)
+ io_buffer = new byte [BufferSize];
- int count = Math.Min (length, io_buffer.Length);
- n = base_stream.Read (io_buffer, 0, count);
- if (n > 0) {
- Marshal.Copy (io_buffer, 0, buffer, n);
- unsafe {
- buffer = new IntPtr ((byte *) buffer.ToPointer () + n);
- }
- length -= n;
- total += n;
- }
- }
- return total;
+ int count = Math.Min (length, io_buffer.Length);
+ int n = base_stream.Read (io_buffer, 0, count);
+ if (n > 0)
+ Marshal.Copy (io_buffer, 0, buffer, n);
+
+ return n;
}
#if MONOTOUCH
}
}
}
+
+ class Bug19313Stream : MemoryStream
+ {
+ public Bug19313Stream (byte [] buffer)
+ : base (buffer)
+ {
+ }
+
+ public override int Read (byte [] buffer, int offset, int count)
+ {
+ // Thread was blocking when DeflateStream uses a NetworkStream.
+ // Because the NetworkStream.Read calls Socket.Receive that
+ // blocks the thread waiting for at least a byte to return.
+ // This assert guarantees that Read is called only when there
+ // is something to be read.
+ Assert.IsTrue (Position < Length, "Trying to read empty stream.");
+
+ return base.Read (buffer, offset, count);
+ }
+ }
+
+ [Test]
+ public void Bug19313 ()
+ {
+ byte [] buffer = new byte [512];
+ using (var backing = new Bug19313Stream (compressed_data))
+ using (var decompressing = new DeflateStream (backing, CompressionMode.Decompress))
+ decompressing.Read (buffer, 0, buffer.Length);
+ }
}
}