ghidra: Uncaught exception! index or length is negative

Describe the bug

index or length is negative
java.lang.IndexOutOfBoundsException: index or length is negative
	at java.desktop/javax.swing.DefaultListSelectionModel.insertIndexInterval(DefaultListSelectionModel.java:656)
	at java.desktop/javax.swing.JTable.tableRowsInserted(JTable.java:4539)
	at java.desktop/javax.swing.JTable.tableChanged(JTable.java:4475)
	at docking.widgets.table.GTable.tableChanged(GTable.java:170)
	at docking.widgets.table.TableModelWrapper.fireTableChanged(TableModelWrapper.java:119)
	at docking.widgets.table.GTableFilterPanel$TranslatingTableModelListener.tableChanged(GTableFilterPanel.java:909)
	at java.desktop/javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:302)
	at docking.widgets.table.AbstractSortedTableModel.fireTableChanged(AbstractSortedTableModel.java:113)
	at ghidra.app.plugin.core.osgi.BundleStatusTableModel.access$001(BundleStatusTableModel.java:45)
	at ghidra.app.plugin.core.osgi.BundleStatusTableModel.lambda$fireTableChanged$0(BundleStatusTableModel.java:98)
	at ghidra.util.Swing.runIfSwingOrRunLater(Swing.java:124)
	at ghidra.app.plugin.core.osgi.BundleStatusTableModel.fireTableChanged(BundleStatusTableModel.java:98)
	at java.desktop/javax.swing.table.AbstractTableModel.fireTableRowsInserted(AbstractTableModel.java:237)
	at ghidra.app.plugin.core.osgi.BundleStatusTableModel$MyBundleHostListener.lambda$bundlesAdded$3(BundleStatusTableModel.java:340)
	at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:773)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:720)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:714)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:400)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87)
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:117)
	at java.desktop/java.awt.WaitDispatchSupport$2.run(WaitDispatchSupport.java:191)
	at java.desktop/java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:236)
	at java.desktop/java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:234)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:319)
	at java.desktop/java.awt.WaitDispatchSupport.enter(WaitDispatchSupport.java:234)
	at java.desktop/java.awt.Dialog.show(Dialog.java:1079)
	at java.desktop/java.awt.Component.show(Component.java:1728)
	at java.desktop/java.awt.Component.setVisible(Component.java:1675)
	at java.desktop/java.awt.Window.setVisible(Window.java:1036)
	at java.desktop/java.awt.Dialog.setVisible(Dialog.java:1015)
	at docking.DockingDialog.setVisible(DockingDialog.java:353)
	at docking.DockingWindowManager.lambda$doShowDialog$6(DockingWindowManager.java:1801)
	at ghidra.util.Swing.doRun(Swing.java:292)
	at ghidra.util.Swing.runNow(Swing.java:208)
	at ghidra.util.Swing.runNow(Swing.java:163)
	at docking.DockingWindowManager.doShowDialog(DockingWindowManager.java:1805)
	at docking.DockingWindowManager.showDialog(DockingWindowManager.java:1754)
	at ghidra.util.task.TaskDialog.lambda$doShow$7(TaskDialog.java:373)
	at ghidra.util.Swing.runIfSwingOrRunLater(Swing.java:124)
	at ghidra.util.task.TaskDialog.doShow(TaskDialog.java:370)
	at ghidra.util.task.TaskDialog.doShowModal(TaskDialog.java:350)
	at ghidra.util.task.TaskDialog.show(TaskDialog.java:324)
	at ghidra.util.task.TaskRunner.lambda$showTaskDialog$1(TaskRunner.java:119)
	at ghidra.util.Swing.runIfSwingOrRunLater(Swing.java:124)
	at ghidra.util.task.TaskRunner.showTaskDialog(TaskRunner.java:116)
	at ghidra.util.task.TaskRunner.run(TaskRunner.java:54)
	at ghidra.util.task.TaskLauncher.<init>(TaskLauncher.java:221)
	at ghidra.util.task.TaskLauncher.<init>(TaskLauncher.java:203)
	at ghidra.app.plugin.core.progmgr.ProgramManagerPlugin.loadPrograms(ProgramManagerPlugin.java:840)
	at ghidra.app.plugin.core.progmgr.ProgramManagerPlugin.readDataState(ProgramManagerPlugin.java:740)
	at ghidra.framework.plugintool.PluginManager.restoreDataStateFromXml(PluginManager.java:381)
	at ghidra.framework.plugintool.PluginTool.restoreDataStateFromXml(PluginTool.java:600)
	at ghidra.framework.project.tool.WorkspaceImpl.restoreFromXml(WorkspaceImpl.java:183)
	at ghidra.framework.project.tool.ToolManagerImpl.restoreFromXml(ToolManagerImpl.java:322)
	at ghidra.framework.project.DefaultProject.restore(DefaultProject.java:484)
	at ghidra.framework.project.DefaultProjectManager.openProject(DefaultProjectManager.java:142)
	at ghidra.GhidraRun.doOpenProject(GhidraRun.java:190)
	at ghidra.GhidraRun.lambda$openProject$3(GhidraRun.java:183)
	at ghidra.util.Swing.lambda$runNow$2(Swing.java:227)
	at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:773)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:720)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:714)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:400)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87)
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:117)
	at java.desktop/java.awt.WaitDispatchSupport$2.run(WaitDispatchSupport.java:191)
	at java.desktop/java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:236)
	at java.desktop/java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:234)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:319)
	at java.desktop/java.awt.WaitDispatchSupport.enter(WaitDispatchSupport.java:234)
	at java.desktop/java.awt.Dialog.show(Dialog.java:1079)
	at java.desktop/java.awt.Component.show(Component.java:1728)
	at java.desktop/java.awt.Component.setVisible(Component.java:1675)
	at java.desktop/java.awt.Window.setVisible(Window.java:1036)
	at java.desktop/java.awt.Dialog.setVisible(Dialog.java:1015)
	at docking.DockingDialog.setVisible(DockingDialog.java:353)
	at docking.DockingWindowManager.lambda$doShowDialog$6(DockingWindowManager.java:1801)
	at ghidra.util.Swing.doRun(Swing.java:292)
	at ghidra.util.Swing.runNow(Swing.java:208)
	at ghidra.util.Swing.runNow(Swing.java:163)
	at docking.DockingWindowManager.doShowDialog(DockingWindowManager.java:1805)
	at docking.DockingWindowManager.showDialog(DockingWindowManager.java:1754)
	at ghidra.util.task.TaskDialog.lambda$doShow$7(TaskDialog.java:373)
	at ghidra.util.Swing.runIfSwingOrRunLater(Swing.java:124)
	at ghidra.util.task.TaskDialog.doShow(TaskDialog.java:370)
	at ghidra.util.task.TaskDialog.doShowModal(TaskDialog.java:350)
	at ghidra.util.task.TaskDialog.show(TaskDialog.java:324)
	at ghidra.util.task.TaskRunner.lambda$showTaskDialog$1(TaskRunner.java:119)
	at ghidra.util.Swing.runIfSwingOrRunLater(Swing.java:124)
	at ghidra.util.task.TaskRunner.showTaskDialog(TaskRunner.java:116)
	at ghidra.util.task.TaskRunner.run(TaskRunner.java:54)
	at ghidra.util.task.TaskLauncher.<init>(TaskLauncher.java:221)
	at ghidra.util.task.TaskLauncher.<init>(TaskLauncher.java:203)
	at ghidra.util.task.TaskLauncher.launchModal(TaskLauncher.java:153)
	at ghidra.GhidraRun.openProject(GhidraRun.java:184)
	at ghidra.GhidraRun.openProject(GhidraRun.java:175)
	at ghidra.GhidraRun.lambda$launch$0(GhidraRun.java:92)
	at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:773)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:720)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:714)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:400)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87)
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

---------------------------------------------------
Build Date: 2023-Sep-28 1301 EDT
Ghidra Version: 10.4
Java Home: /Library/Java/JavaVirtualMachines/temurin-21.jdk/Contents/Home
JVM Version: Eclipse Adoptium 21.0.1
OS: Mac OS X 14.1 aarch64

To Reproduce Steps to reproduce the behavior:

  1. open ghidra project
  2. double click on file in 'Active Project`
  3. exception dialog window is opened
  4. details are shown above

Expected behavior Open file without exception.

Screenshots n/a

Attachments n/a

Environment (please complete the following information):

  • OS: Mac OS X 14.1 aarch64
  • Java Version: Temurin 21.0.1,12 from brew
  • Ghidra Version: 10.4 Build Public 2023-Sep-28 1301 EDT
  • Ghidra Origin: brew -> ghidra: 10.4,20230928

Additional context n/a

About this issue

  • Original URL
  • State: closed
  • Created 8 months ago
  • Comments: 23

Most upvoted comments

Thank you @ryanmkurtz !

I am assigning this to myself and will revisit it when we are doing more testing with JDK 21.

Some pretty wanky logic in the AbstractTableModel::fireListenerChanged, though - why assume listeners.length >= 2?

I believe that is because that particular class uses the listeners field to store the listener’s type along with the listener itself. Thus, there will always be 2 entries for each listener in that array. That being said, that is Java’s code, not Ghidra’s.

The stack trace shows the issue being triggered by the Bundle Manager, which is related to script bundles. My guess is that you have configured one or more script bundles in the past. Something inside of the tool when restoring that bundle state seems to be causing the issue.