[Mono-bugs] [Bug 657388] New: Array.Resize corrupts a GZipStream.Read operation
bugzilla_noreply at novell.com
bugzilla_noreply at novell.com
Fri Dec 3 07:54:23 EST 2010
https://bugzilla.novell.com/show_bug.cgi?id=657388
https://bugzilla.novell.com/show_bug.cgi?id=657388#c0
Summary: Array.Resize corrupts a GZipStream.Read operation
Classification: Mono
Product: MonoTouch
Version: unspecified
Platform: Macintosh
OS/Version: Mac OS X 10.6
Status: NEW
Severity: Normal
Priority: P5 - None
Component: Class Libraries
AssignedTo: gnorton at novell.com
ReportedBy: johan.otto at justenough.com
QAContact: mono-bugs at lists.ximian.com
Found By: ---
Blocker: ---
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-us)
AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4
I have this static method that reads a buffer from a stream in chunks of 512
bytes... this code works fine on our other platforms but in MonoTouch I get the
error:
Corrupted data ReadInternal...
System.IO.Compression.DeflateStream.CheckResult(Int32 result, System.String
where)
To workaround the problem I declared a #if !IPHONE and rather BlockCopy the
previous array into a new one. To test just take out these sections. I think
that this work-around is more memory intensive so it would be appreciated if
the issue is addressed in the mono code.
Reproducible: Always
Steps to Reproduce:
Use this method to populate a buffer from a GZipStream and take out the #if
sections...
/// <summary>
/// Reads all bytes from stream.
/// </summary>
/// <param name="stream">The stream.</param>
/// <param name="buffer">The buffer.</param>
/// <returns>The number of bytes read.</returns>
public static int ReadAllBytesFromStream(Stream stream, ref byte[]
buffer)
{
// Use this method is used to read all bytes from a stream.
const int increment = 512;
int offset = 0;
int totalCount = 0;
unchecked
{
while (true)
{
if ((offset + increment) > buffer.Length)
{
int newSize = buffer.Length + (increment * 10);
#if !IPHONE
Array.Resize<byte>(ref buffer, newSize);
#else
byte[] buffer2 = new byte[newSize];
Buffer.BlockCopy(buffer, 0, buffer2, 0,
buffer2.Length);
buffer = buffer2;
#endif
}
int bytesRead = stream.Read(buffer, offset, increment);
if (bytesRead == 0)
{
break;
}
offset += bytesRead;
totalCount += bytesRead;
}
if (buffer.Length != totalCount)
{
#if !IPHONE
Array.Resize<byte>(ref buffer, totalCount);
#else
byte[] buffer2 = new byte[totalCount];
Buffer.BlockCopy(buffer, 0, buffer2, 0, buffer2.Length);
buffer = buffer2;
#endif
}
return totalCount;
}
Actual Results:
Array.Resize somehow corrupts the buffer.
Expected Results:
Error should not happen under normal circumstances.
--
Configure bugmail: https://bugzilla.novell.com/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug.
More information about the mono-bugs
mailing list