Bug 563822 - CTabFolder ArrayIndexOutOfBounds
Summary: CTabFolder ArrayIndexOutOfBounds
Status: VERIFIED FIXED
Alias: None
Product: Platform
Classification: Eclipse Project
Component: SWT (show other bugs)
Version: 4.16   Edit
Hardware: PC Windows 10
: P3 normal (vote)
Target Milestone: 4.16 RC2   Edit
Assignee: Paul Pazderski CLA
QA Contact:
URL:
Whiteboard:
Keywords: regression
Depends on:
Blocks: 507611
  Show dependency tree
 
Reported: 2020-06-02 09:14 EDT by Mike Marchand CLA
Modified: 2020-06-05 09:52 EDT (History)
4 users (show)

See Also:
daniel_megert: pmc_approved+


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Mike Marchand CLA 2020-06-02 09:14:16 EDT
I have encountered an ArrayIndexOutOfBounds exception.  I'm unfortunately not 100% sure how to reproduce it, even though this happens every time I launch our Eclipse based product.

I was able to investigate the problem.  It is caused by commit bfae5c9790e0327102cb5a33397b89aa08090059.  Basically, the change has an effect on the behavior of getTabHeight(), for reasons still unknown to me (for lack of digging), calling getTabHeight() can now affect controls.length.  This is a big deal because in computeControlBounds(), we use controls.length to initialize arrays, then we call getTabHeight() and we iterate from i=0; i<controls.length... which is now a larger number than it was before calling getTabHeight().

I think it's a fundamental problem to be changing the number of controls for the CTabFolder in getTabHeight()... but in the meantime, I was able to fix the ArrayIndexOutOfBoundsException by moving the getTabHeight() call to the very top of the computeControlBounds() function.  I'll submit a Gerrit for reference.

!ENTRY org.eclipse.e4.ui.workbench.swt 4 2 2020-06-02 09:01:05.574
!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.e4.ui.workbench.swt".
!STACK 0
java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1
	at org.eclipse.swt.custom.CTabFolder.computeControlBounds(CTabFolder.java:649)
	at org.eclipse.swt.custom.CTabFolder.getWrappedHeight(CTabFolder.java:4138)
	at org.eclipse.swt.custom.CTabFolder.getClientArea(CTabFolder.java:874)
	at org.eclipse.swt.custom.CTabFolder.setSelection(CTabFolder.java:3226)
	at org.eclipse.swt.custom.CTabFolder.setSelection(CTabFolder.java:3187)
	at org.eclipse.e4.ui.workbench.renderers.swt.StackRenderer.showTab(StackRenderer.java:1306)
	at org.eclipse.e4.ui.workbench.renderers.swt.LazyStackRenderer.postProcess(LazyStackRenderer.java:105)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:678)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:766)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$0(PartRenderingEngine.java:737)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:731)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:715)
	at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.processContents(SWTPartRenderer.java:71)
	at com.crank.gdt.ui.swt.rendering.SashRenderer.processContents(SashRenderer.java:128)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:674)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$1.run(PartRenderingEngine.java:545)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:529)
	at org.eclipse.e4.ui.workbench.renderers.swt.ElementReferenceRenderer.createWidget(ElementReferenceRenderer.java:73)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createWidget(PartRenderingEngine.java:1000)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:660)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:766)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$0(PartRenderingEngine.java:737)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:731)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:715)
	at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.processContents(SWTPartRenderer.java:71)
	at com.crank.gdt.ui.swt.rendering.SashRenderer.processContents(SashRenderer.java:128)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:674)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:766)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$0(PartRenderingEngine.java:737)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:731)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:715)
	at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.processContents(SWTPartRenderer.java:71)
	at com.crank.gdt.ui.swt.rendering.SashRenderer.processContents(SashRenderer.java:128)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:674)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:766)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$0(PartRenderingEngine.java:737)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:731)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:715)
	at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.processContents(SWTPartRenderer.java:71)
	at com.crank.gdt.ui.swt.rendering.SashRenderer.processContents(SashRenderer.java:128)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:674)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:766)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$0(PartRenderingEngine.java:737)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:731)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:715)
	at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.processContents(SWTPartRenderer.java:71)
	at org.eclipse.e4.ui.workbench.renderers.swt.PerspectiveRenderer.processContents(PerspectiveRenderer.java:51)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:674)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:766)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$0(PartRenderingEngine.java:737)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:731)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:715)
	at org.eclipse.e4.ui.workbench.renderers.swt.PerspectiveStackRenderer.showTab(PerspectiveStackRenderer.java:82)
	at org.eclipse.e4.ui.workbench.renderers.swt.LazyStackRenderer.postProcess(LazyStackRenderer.java:105)
	at org.eclipse.e4.ui.workbench.renderers.swt.PerspectiveStackRenderer.postProcess(PerspectiveStackRenderer.java:64)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:678)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:766)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$0(PartRenderingEngine.java:737)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:731)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:715)
	at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.processContents(SWTPartRenderer.java:71)
	at com.crank.gdt.ui.swt.rendering.SashRenderer.processContents(SashRenderer.java:128)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:674)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:766)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$0(PartRenderingEngine.java:737)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:731)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:715)
	at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.processContents(SWTPartRenderer.java:71)
	at org.eclipse.e4.ui.workbench.renderers.swt.WBWRenderer.processContents(WBWRenderer.java:666)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:674)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:766)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$0(PartRenderingEngine.java:737)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:731)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:715)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1084)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:338)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1047)
	at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:155)
	at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:658)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:338)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:557)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:154)
	at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:150)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:203)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:137)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:107)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:401)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:255)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:657)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:594)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1447)
	at org.eclipse.equinox.launcher.Main.main(Main.java:1420)
Comment 1 Mike Marchand CLA 2020-06-02 09:15:47 EDT
Paul, I'm tentatively assigning this to you in hopes that you might be able to take a look at it.
Comment 2 Eclipse Genie CLA 2020-06-02 09:18:57 EDT
New Gerrit change created: https://git.eclipse.org/r/163989
Comment 3 Paul Pazderski CLA 2020-06-02 12:08:36 EDT
A strange issue. I'm in favor of reverting the offending commit at the moment.

The extra control is most likely the min/max button (can be seen as one in this context) or less likely the chevron.
What make it strange is that in we go through getClientArea() -> getWrappedHeight() -> computeControlBounds().
You said you could avoid the issue by adding getTabHeight() at the begin of computeControlBounds(). But a bit earlier in getClientArea() we call computeTrim(CTabFolderRenderer.PART_BODY) which does effectively the as your added line. It will update the tabHeight and if tabHeight is up-to-date getTabHeight() does the same as before the change.

I.e. (if I haven't missed something important) the only way to get your exception is if something outside CTabFolder is doing a operation which require tabHeight recalculation and it has to do it between computeTrim() in getClientArea() and the start of computeControlBounds(). And I could not yet find any way to do it.
Comment 4 Paul Pazderski CLA 2020-06-02 12:13:47 EDT
(In reply to Eclipse Genie from bug 507611 comment #22)
> New Gerrit change created: https://git.eclipse.org/r/164006

The revert for the problematic commit. Mike please test if it does fix your problem. (if you haven't done it already)

And what I forgot to ask: can you see any consequences (wrong rendering or something) from this exception?
Comment 5 Mike Marchand CLA 2020-06-02 13:24:28 EDT
(In reply to Paul Pazderski from comment #4)
> (In reply to Eclipse Genie from bug 507611 comment #22)
> > New Gerrit change created: https://git.eclipse.org/r/164006
> 
> The revert for the problematic commit. Mike please test if it does fix your
> problem. (if you haven't done it already)
> 
> And what I forgot to ask: can you see any consequences (wrong rendering or
> something) from this exception?

Hi Paul, the exception causes the shared area not to render.  

This issue reproducing for me almost certainly has to do with the fact that we have a custom tab rendering implementation.  I might have to compare more closely to the current implementations since they have grown slightly different.

https://git.eclipse.org/r/164006 does fix the problem.  

I'm now seeing that my patch actually causes a problem when opening Eclipse with no editors.
Comment 6 Dani Megert CLA 2020-06-03 09:13:54 EDT
I approve to revert for RC2.
Comment 7 Paul Pazderski CLA 2020-06-03 10:18:24 EDT
Thanks. Reverted.

@Mike would be great if you could verify that the issue is fixed with next I-build containing the revert.
Comment 8 Lakshmi P Shanmugam CLA 2020-06-05 01:56:54 EDT
(In reply to Paul Pazderski from comment #7)
> Thanks. Reverted.
> 
> @Mike would be great if you could verify that the issue is fixed with next
> I-build containing the revert.

@Mike, can you please verify that the bug is fixed with the latest build? - https://download.eclipse.org/eclipse/downloads/drops4/I20200604-0540/
Comment 9 Mike Marchand CLA 2020-06-05 08:56:13 EDT
(In reply to Paul Pazderski from comment #7)
> Thanks. Reverted.
> 
> @Mike would be great if you could verify that the issue is fixed with next
> I-build containing the revert.

Hi Paul, it works well for me! Thanks for fixing this.  Hopefully the bug the reverted fix addressed isn't going to cause many hardships.  Let me know if you need any assistance if you pick it back up for 4.17, at the very least I can test out the new patch for you in our environment.
Comment 10 Paul Pazderski CLA 2020-06-05 09:52:42 EDT
Thanks Mike. The bug it should fix wasn't new, big or urgent so I see no problem there. If I have a new attempt I'll cc you.