[Mono-bugs] [Bug 77810][Cri] Changed - Loading a page in XSP compiled on mono for osx86 fails

bugzilla-daemon at bugzilla.ximian.com bugzilla-daemon at bugzilla.ximian.com
Fri Mar 17 19:38:28 EST 2006


Please do not reply to this email- if you want to comment on the bug, go to the
URL shown below and enter your comments there.

Changed by seanhig at geminibay.com.

http://bugzilla.ximian.com/show_bug.cgi?id=77810

--- shadow/77810	2006-03-17 01:45:41.000000000 -0500
+++ shadow/77810.tmp.12679	2006-03-17 19:38:28.000000000 -0500
@@ -2,13 +2,13 @@
 Product: Mono: Runtime
 Version: 1.0
 OS: other
 OS Details: Mac OSX on Intel (Macbook Pro)
 Status: NEW   
 Resolution: 
-Severity: 
+Severity: Unknown
 Priority: Critical
 Component: io-layer
 AssignedTo: dick at ximian.com                            
 ReportedBy: seanhig at geminibay.com               
 QAContact: mono-bugs at ximian.com
 TargetMilestone: ---
@@ -80,6 +80,149 @@
 
 How often does this happen? 
 
 -> Any time you go to use it.
 
 Additional Information:
+
+------- Additional Comments From seanhig at geminibay.com  2006-03-17 19:38 -------
+I spent some time trying to figure out what was causing this, and I think I have tracked it 
+down (to a certain level)...  I used some hack instrumentation to dig into the Exception that 
+was coming out of StreamReader.ReadToEnd() when I was trying to use XSP.
+
+Below is the output from XSP as the first page is loaded, and it tries to parse the 
+machine.config.
+
+xsp
+Listening on port: 8080 (non-secure)
+Listening on address: 0.0.0.0
+Root directory: /usr/local/lib/xsp/test
+Hit Return to stop the server.
+Attempting a Read on: [Unknown]
+Read: target buffer length (dest): 1024
+ReadInternal: dest length: 1024, count: 1024
+ReadSegment: adjusting count: [new] 0
+ReadSegment: start read segment: buf_length: 0, buf_offset: 0, count: 0
+ReadSegment: new buff_offset: 0
+ReadInternal: ReadSegment returned n: 0
+ReadInternal: copied was 0, now: 0
+ReadInternal: count is now: 1024
+ReadInternal: read as much as we can up to count: 1024
+/usr/local/etc/mono/1.0/machine.config
+creating the stream reader
+About to call the streamreader
+StreamReader.ReadToEnd: decoded_buffer.length: 4096
+Attempting a Read on: /usr/local/etc/mono/1.0/machine.config
+Read: target buffer length (dest): 4096
+ReadInternal: dest length: 4096, count: 4096
+ReadSegment: adjusting count: [new] 0
+ReadSegment: start read segment: buf_length: 0, buf_offset: 0, count: 0
+ReadSegment: new buff_offset: 0
+ReadInternal: ReadSegment returned n: 0
+ReadInternal: copied was 0, now: 0
+ReadInternal: count is now: 4096
+ReadInternal: ** refilling buffer
+ReadSegment: start read segment: buf_length: 8192, buf_offset: 0, count: 4096
+ReadSegment: new buff_offset: 4096
+ReadInternal: ReadSegment returned n: 4096
+ReadInternal: returning copied to caller: 4096
+StreamReader: created new buffer: 4096
+Attempting a Read on: /usr/local/etc/mono/1.0/machine.config
+Read: target buffer length (dest): 4096
+ReadInternal: dest length: 4096, count: 4096
+ReadSegment: start read segment: buf_length: 8192, buf_offset: 4096, count: 4096
+ReadSegment: new buff_offset: 8192
+ReadInternal: ReadSegment returned n: 4096
+ReadInternal: copied was 0, now: 4096
+ReadInternal: count is now: 0
+ReadInternal: count is 0 returning copied value to caller
+StreamReader.ReadToEnd: len after Read : 4096
+StreamReader.ReadToEnd: text : 4096
+StreamReader: created new buffer: 4096
+Attempting a Read on: /usr/local/etc/mono/1.0/machine.config
+Read: target buffer length (dest): 4096
+ReadInternal: dest length: 4096, count: 4096
+ReadSegment: adjusting count: [new] 0
+ReadSegment: start read segment: buf_length: 8192, buf_offset: 8192, count: 0
+ReadSegment: new buff_offset: 8192
+ReadInternal: ReadSegment returned n: 0
+ReadInternal: copied was 0, now: 0
+ReadInternal: count is now: 4096
+ReadInternal: ** refilling buffer
+ReadSegment: start read segment: buf_length: 8192, buf_offset: 0, count: 4096
+ReadSegment: new buff_offset: 4096
+ReadInternal: ReadSegment returned n: 4096
+ReadInternal: returning copied to caller: 4096
+StreamReader.ReadToEnd: len after Read : 4096
+StreamReader.ReadToEnd: text : 8192
+StreamReader: created new buffer: 4096
+Attempting a Read on: /usr/local/etc/mono/1.0/machine.config
+Read: target buffer length (dest): 4096
+ReadInternal: dest length: 4096, count: 4096
+ReadSegment: start read segment: buf_length: 8192, buf_offset: 4096, count: 4096
+ReadSegment: new buff_offset: 8192
+ReadInternal: ReadSegment returned n: 4096
+ReadInternal: copied was 0, now: 4096
+ReadInternal: count is now: 0
+ReadInternal: count is 0 returning copied value to caller
+StreamReader.ReadToEnd: len after Read : 4096
+StreamReader.ReadToEnd: text : 12288
+StreamReader: created new buffer: 4096
+Attempting a Read on: /usr/local/etc/mono/1.0/machine.config
+Read: target buffer length (dest): 6488165
+System.TypeInitializationException: An exception was thrown by the type initializer for 
+System.Runtime.Remoting.RemotingServices ---> System.ObjectDisposedException: The 
+object was used after being disposed.
+in <0x00446> System.IO.FileStream:Read (Sys
+
+I believe it is related to the [in,out] parameter on the FileStream.Read method for the 
+destination buffer:
+
+        public override int Read ([In,Out] byte[] dest, int dest_offset, int count)
+        {
+            System.Console.WriteLine("Attempting a Read on: " + name);
+            System.Console.WriteLine("Read: target buffer length (dest): " + dest.Length);
+
+
+This section of the output is what shows where the memory corruption occurs, and what 
+follows is exceptions (and SIGSEVs):
+        
+StreamReader: created new buffer: 4096
+Attempting a Read on: /usr/local/etc/mono/1.0/machine.config
+Read: target buffer length (dest): 6488165
+
+The following (hacked up) code snippet shows the caller StreamReader loop for chunking 
+the file.  It gets about 3/4 into the file, reading it properly (I can dump out the text 
+StringBuffer and see the XML). For each chunk I had it create a new dest buffer... The 
+original code re-uses the same buffer, so I tried this to see if it changed the outcome - 
+and it didn't... With the new buffer in hand it then attempts to pass it into the 
+FileStream.Read():
+
+            while (len > 0 || len == -1)
+            {        
+                buffer = new char [size];
+                System.Console.WriteLine("StreamReader: created new buffer: " + 
+buffer.Length);                
+                
+                len = Read (buffer, 0, size);
+                System.Console.WriteLine("StreamReader.ReadToEnd: len after Read : " + len);                
+
+                if(len > 0) 
+                {
+                    text.Append (buffer, 0, len);
+                    System.Console.WriteLine("StreamReader.ReadToEnd: text : " + text.ToString
+().Length);
+                }
+            }
+
+
+what the output shows is that the destination buffer, when it is created, is 4096 as 
+expected, but just after it has been passed into Read() it is some obviously bogus length: 
+6488165.
+
+This is likely something down in the core mem handling that is way beyond me.  I assume 
+it is related to the [in, out] param, as the buffer looks fine just before the call.
+
+Is anyone aware of this and working on it?  Anything more I can do?
+
+Hope this helps - I really need mono to run on my MacBook :)
+


More information about the mono-bugs mailing list