> On 7/25/05, Christoph Theis <[EMAIL PROTECTED]> wrote:
>> Anyway, John Wilson will be the one who can judge my idea as he is
>> the only one who really understands the parser. I will let it up to
>> him to decide if its really a bug and how to patch it.
> Even John will prefer to discuss a nice context diff.
OK, here is the diff.
The first sections adds a buffer.flush(). I had to do that because I
got an ArrayIndexOutOfBounds Exception when parsing large CDATA
sections: writing to the buffer hits the array boundary. But I dont
fully understand why that happens.
The second section is the problem I wrote about: Writing to the buffer
could overwrite the next character to read.
Regards
Christoph
Index: MinML.java
===================================================================
RCS file: /home/cvspublic/ws-xmlrpc/src/java/uk/co/wilson/xml/MinML.java,v
retrieving revision 1.3
diff -w -c -r1.3 MinML.java
*** MinML.java 18 Jan 2003 13:40:03 -0000 1.3
--- MinML.java 27 Jul 2005 04:29:20 -0000
***************
*** 357,362 ****
--- 357,363 ----
}
buffer.write(']');
+ buffer.flush();
buffer.write(currentChar);
continue; // not end of CDATA section, don't change state
***************
*** 606,616 ****
--- 607,632 ----
}
public void write(final int c) throws IOException {
+ // flush if there is not enough space for the character
+ if (written && count == nextIn)
+ _flush();
+
written = true;
chars[count++] = (char)c;
}
public void write(final char[] cbuf, final int off, final int len) throws
IOException {
+ // flush if there is not enough space for the array
+ if (written && (count + len) > nextIn)
+ _flush();
+
+ // Write single characters if there is still not enough space
+ if (count + len > nextIn) {
+ for (int i = 0; i < len; i++)
+ write(cbuf[off+i]);
+ return;
+ }
+
written = true;
System.arraycopy(cbuf, off, chars, count, len);
count += len;