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