Timon Hertli created XMLBEANS-604:
-------------------------------------
Summary: Incorrect Assert in Saver.TextSaver
Key: XMLBEANS-604
URL: https://issues.apache.org/jira/browse/XMLBEANS-604
Project: XMLBeans
Issue Type: Bug
Components: XmlObject
Affects Versions: Version 5.0.3
Environment: Windows 10, JDK 1.8.0_311
Reporter: Timon Hertli
If the Buffer _buf in
org.apache.xmlbeans.impl.store.Saver.TextSaver.write(Writer, int) is completely
filled (this happens if the current charsAvailable is a large power of 2, in
the example 2^14=16384), the _in index is set to 0 ( = 16384 % 16384) in
emit(String). This causes the assertion
{code:java}
assert _free == _buf.length - _in;{code}
to fail (with _free = 0, _buf.length = 16384, _in = 0). The behaviour of the
code seems correct, but the assert does not account for the fact that _in can
wrap around to 0.
The following code reproduces the problem (if assertions are enabled):
{code:java}
import org.apache.xmlbeans.XmlBeans;
import org.apache.xmlbeans.XmlObject;
import java.io.InputStream;
public class AssertionTest {
public static void main(String[] args) throws Exception {
System.getProperties().setProperty("line.separator", "\n");
String xml = "<test>" + new String(new char[16339]).replace('\0', 'x') +
"</test>";
XmlObject object = XmlObject.Factory.parse(xml);
try (InputStream is = object.newInputStream()) {
is.read(new byte[8192], 0, 8192);
}
}
}{code}
with the following stack trace:
{code:java}
Exception in thread "main" java.lang.AssertionError
at org.apache.xmlbeans.impl.store.Saver$TextSaver.write(Saver.java:1708)
at
org.apache.xmlbeans.impl.store.Saver$InputStreamSaver.ensure(Saver.java:2344)
at
org.apache.xmlbeans.impl.store.Saver$InputStreamSaver.access$200(Saver.java:2230)
at
org.apache.xmlbeans.impl.store.Saver$InputStreamSaver$OutputStreamImpl.read(Saver.java:2389)
at
org.apache.xmlbeans.impl.store.Saver$InputStreamSaver.lambda$read$0(Saver.java:2328)
at org.apache.xmlbeans.impl.store.Saver.syncWrap(Saver.java:2180)
at org.apache.xmlbeans.impl.store.Saver.access$000(Saver.java:33)
at
org.apache.xmlbeans.impl.store.Saver$InputStreamSaver.read(Saver.java:2328)
at AssertionTest.main(AssertionTest.java:12){code}
--
This message was sent by Atlassian Jira
(v8.20.1#820001)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]