Saving xml with '&' and '<' characters in attribute values throws an 
ArrayIndexOutOfBoundsException
---------------------------------------------------------------------------------------------------

         Key: XMLBEANS-179
         URL: http://issues.apache.org/jira/browse/XMLBEANS-179
     Project: XMLBeans
        Type: Bug
    Versions: Version 2, Version 1.0.3, Version 1.0.4    
 Environment: Mac OS X Panther, Java 1.4.2
    Reporter: Olek Poplavskyy


Look at this xml snippet:
    <Net id="dbid:66754220" name="3&lt;.3V" type="POWER"/>

It was read succesfully by xmlbeans but when attempt was made to save it, it 
threw an exception.

java.lang.ArrayIndexOutOfBoundsException: 32754
        at org.apache.xmlbeans.impl.store.Saver$TextSaver.emit(Saver.java:1785)
        at 
org.apache.xmlbeans.impl.store.Saver$TextSaver.emitAttrHelper(Saver.java:1419)
        at 
org.apache.xmlbeans.impl.store.Saver$TextSaver.emitContainerHelper(Saver.java:1449)
        at 
org.apache.xmlbeans.impl.store.Saver$TextSaver.emitContainer(Saver.java:1352)
        at org.apache.xmlbeans.impl.store.Saver.processContainer(Saver.java:775)
        at org.apache.xmlbeans.impl.store.Saver.process(Saver.java:518)
        at 
org.apache.xmlbeans.impl.store.Saver$TextSaver.ensure(Saver.java:1658)
        at org.apache.xmlbeans.impl.store.Saver$TextSaver.read(Saver.java:2148)
        at org.apache.xmlbeans.impl.store.Saver$TextReader.read(Saver.java:2271)
        at org.apache.xmlbeans.impl.store.Cursor.save(Cursor.java:3118)
        at 
org.apache.xmlbeans.impl.values.XmlObjectBase.save(XmlObjectBase.java:167)
        at 
com.designadvance.template.pcb.parser.PCBLibraryWriter.writeSelfContainedMembershipTemplate(PCBLibraryWriter.java:179)
         ...

I found that in Saver.java in method replace() code was ignoring the fact that 
buffer is circular and was trying to write too much data to the end of it.


Here is corrected code for replace method:

        private int replace ( int i, String replacement )
        {
            assert replacement.length() > 0;

            int dCch = replacement.length() - 1;

            if (dCch == 0)
            {
                _buf[ i ] = replacement.charAt( 0 );
                return i + 1;
            }

            assert _free >= 0;

            if (dCch > _free)
                i = resize( dCch, i );
            
            assert _free >= 0;

            assert _free >= dCch;
            assert getAvailable() > 0;

            if (_out > _in && i >= _out)
            {
                System.arraycopy( _buf, _out, _buf, _out - dCch, i - _out );
                _out -= dCch;
                i -= dCch;
            }
            else
            {
                assert i < _in;
                int availableEndChunk = _buf.length - _in;
                int totalToCopy = _in - i;
                if ( dCch < availableEndChunk )
                {
                    System.arraycopy( _buf, i, _buf, i + dCch, totalToCopy );
                    _in += dCch;
                }
                else
                {
                    int numToCopyToStart = totalToCopy - availableEndChunk;
                    System.arraycopy( _buf, _in-numToCopyToStart, _buf, 0, 
numToCopyToStart );
                    System.arraycopy( _buf, i, _buf, i+dCch, availableEndChunk 
);

                    _in = numToCopyToStart;
                }
            }

            replacement.getChars( 0, dCch + 1, _buf, i );

            _free -= dCch;
            
            assert _free >= 0;

            return i + dCch + 1;
        }
 

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to