Hello!
I guess I encountered a bug in the MinML parser:
When the parser checks for endCDATA, it will check for two ']'
followed by a '>'. If that is not the case it will write 3 characters,
the two '>' and the offending character to the buffer. In that state
it might overwrite the next characters to read.
As an example consider the sequence "]]+:".
When reading the '+' the parser determines that it is not end of CDATA
and will write ']', ']' and '+' to the buffer. Now it could happen
that when reading the '+' the parser is at the end of the read buffer
(nextIn == lastIn) and will flush the buffer setting count = 0 and
nextIn = 1. Writing the reamining characters will now overwrite nextIn,
that is the ':' with second ']'. So write has to check if count is
still less than nextIn.
In MinML$MinMLBuffer an implementation for write would be, assuming
that nextIn will never be 0.
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;
}
Sorry I can't give you a diff context since I changed more than that in MinML
(I had to determine the enconding of the XML file).
Regards
Christoph Theis