AbstractIoBuffer.getSlice(int index, int length) has incorrect behavior
-----------------------------------------------------------------------

                 Key: DIRMINA-829
                 URL: https://issues.apache.org/jira/browse/DIRMINA-829
             Project: MINA
          Issue Type: Bug
          Components: Core
    Affects Versions: 2.0.2
            Reporter: Anton Sitnikov
            Priority: Minor


All indexed access function of IoBuffer (getXXX(int index, ...)) supposed to 
keep IoBuffer state intact. getSlice(int index, int length) method in 
AbstractIoBuffer class behave differenlty. After its execution buffer posistion 
is moved to value of index parameter:
{code}
    public final IoBuffer getSlice(int index, int length) {
        if (length < 0) {
            throw new IllegalArgumentException("length: " + length);
        }
        
        int limit = limit();
        
        if (index > limit) {
            throw new IllegalArgumentException("index: " + index);
        }
        
        int endIndex = index + length;

        if (capacity() < endIndex) {
            throw new IndexOutOfBoundsException("index + length (" + endIndex
                    + ") is greater " + "than capacity (" + capacity() + ").");
        }

        clear();
        position(index);
        limit(endIndex);

        IoBuffer slice = slice();
        position(index);
        limit(limit);
        return slice;
    }
{code}
As you can see, this method checks also resulting slice upper limit against 
original buffer capcity (not against limit), which I suppose is wrong too.

I think this method should be changed like this:
{code}
    public final IoBuffer getSlice(int index, int length) {
        if (length < 0) {
            throw new IllegalArgumentException("length: " + length);
        }
        
        int pos = position();
        int limit = limit();
        
        if (index > limit) {
            throw new IllegalArgumentException("index: " + index);
        }
        
        int endIndex = index + length;

        if (endIndex > limit) {
            throw new IndexOutOfBoundsException("index + length (" + endIndex
                    + ") is greater " + "than capacity (" + capacity() + ").");
        }

        clear();
        position(index);
        limit(endIndex);

        IoBuffer slice = slice();
        position(pos);
        limit(limit);
        return slice;
    }
{code}

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to