You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@netbeans.apache.org by "Markus Sunela (JIRA)" <ji...@apache.org> on 2019/08/14 04:16:00 UTC

[jira] [Created] (NETBEANS-2982) UndoRedo class causes ArrayIndexOutOfBoundsException

Markus Sunela created NETBEANS-2982:
---------------------------------------

             Summary: UndoRedo class causes ArrayIndexOutOfBoundsException
                 Key: NETBEANS-2982
                 URL: https://issues.apache.org/jira/browse/NETBEANS-2982
             Project: NetBeans
          Issue Type: Bug
          Components: platform - Window System
    Affects Versions: 11.1, 11.0, 10.0
            Reporter: Markus Sunela


After a lot of UndoableEdits have been added to an UndoManager in a platform application, the UI sometimes starts to show the exception as it tries to update the name of the next undoable edit for the menus:

 
{code:java}
java.lang.ArrayIndexOutOfBoundsException: 100 >= 100
    at java.base/java.util.Vector.elementAt(Vector.java:496)
    at org.openide.awt.UndoRedo$Manager.editToBeUndone(UndoRedo.java:403)
    at org.openide.awt.UndoRedo$Manager.canUndo(UndoRedo.java:224)
    at org.openide.awt.UndoRedo$Manager.getUndoPresentationName(UndoRedo.java:501)
    at org.openide.actions.UndoRedoAction.getName(UndoRedoAction.java:171)
    at org.openide.actions.UndoRedoAction.run(UndoRedoAction.java:139)
    at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
    at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
    at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:740)
    at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:136)
{code}
 

 

This seems to be due to incorrect handling of indexOfNextAdd in the UndoRedo.java ([https://github.com/apache/netbeans/blob/master/platform/openide.awt/src/org/openide/awt/UndoRedo.java)]. The indexOfNextAdd can be larger (more than by one) than the length of the edits Vector, and especially in editToBeUndone the edits Vector is directly accessed at indexOfNextAdd without any bounds checking:

 
{code:java}
@Override
protected UndoableEdtit editToBeUndone() {
    int i = indexOfNextAdd;
    while (i > 0) {
        UndoableEdit edit = edits.elementAt(--i);
        if (edit.isSignificant()) {
            return edit;
        }
    }

    return null;
}
{code}
For example editToBeRedone returns null in the case indexOfNextAdd >= edit.size().

 

I assume the root cause to be the trimEdits method incorrectly updating the indexOfNextAdd, possibly due to a negative value being passed from trimToLimits:
{code:java}
if (keepFrom < 0) {
    keepTo -= keepFrom;
    keepFrom = 0;
}
if (keepTo >= size) {
    int delta = size - keepTo - 1;
    keepTo += delta;
    keepFrom += delta;
}
{code}
At least, the latter if doesn't ensure non-negative values for either keepTo or keepFrom, which could cause the bug.



--
This message was sent by Atlassian JIRA
(v7.6.14#76016)

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@netbeans.apache.org
For additional commands, e-mail: commits-help@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists