Bug 574216 - IOOBE in CompletionProposalPopup.selectProposal
Guard from direct access on ever changing fFilteredProposals refrence
and check for index inside fFilteredProposals bounds.
Change-Id: I1946c255b54c87724624d5a29cf9b44fc3911b7d
Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
Reviewed-on: https://git.eclipse.org/r/c/platform/eclipse.platform.text/+/182010
Tested-by: Platform Bot <platform-bot@eclipse.org>
diff --git a/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/CompletionProposalPopup.java b/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/CompletionProposalPopup.java
index 3e345ce..4c27e4c 100644
--- a/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/CompletionProposalPopup.java
+++ b/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/CompletionProposalPopup.java
@@ -862,8 +862,9 @@
TableItem item= (TableItem) event.item;
int index= fProposalTable.indexOf(item);
- if (0 <= index && index < fFilteredProposals.size()) {
- ICompletionProposal current= fFilteredProposals.get(index);
+ List<ICompletionProposal> proposals= fFilteredProposals;
+ if (0 <= index && index < proposals.size()) {
+ ICompletionProposal current= proposals.get(index);
String displayString;
StyleRange[] styleRanges= null;
@@ -930,9 +931,11 @@
return null;
int i= fProposalTable.getSelectionIndex();
- if (fFilteredProposals == null || i < 0 || i >= fFilteredProposals.size())
+ List<ICompletionProposal> proposals= fFilteredProposals;
+ if (proposals == null || i < 0 || i >= proposals.size()) {
return null;
- return fFilteredProposals.get(i);
+ }
+ return proposals.get(i);
}
/**
@@ -1411,12 +1414,13 @@
if (oldProposal instanceof ICompletionProposalExtension2 && fViewer != null)
((ICompletionProposalExtension2) oldProposal).unselected(fViewer);
- if (fFilteredProposals == null) {
+ List<ICompletionProposal> proposals= fFilteredProposals;
+ if (proposals == null || index >= proposals.size()) {
fireSelectionEvent(null, smartToggle);
return;
}
- ICompletionProposal proposal= fFilteredProposals.get(index);
+ ICompletionProposal proposal= proposals.get(index);
if (proposal instanceof ICompletionProposalExtension2 && fViewer != null)
((ICompletionProposalExtension2) proposal).selected(fViewer, smartToggle);
@@ -1624,19 +1628,20 @@
fLastCompletionOffset= fFilterOffset;
fFilteredProposals= computeProposals(fInvocationOffset);
- int count= (fFilteredProposals == null ? 0 : fFilteredProposals.size());
+ List<ICompletionProposal> proposals= fFilteredProposals;
+ int count= (proposals == null ? 0 : proposals.size());
if (count == 0 && hideWhenNoProposals(false))
return;
- if (count == 1 && canAutoInsert(fFilteredProposals.get(0))) {
- insertProposal(fFilteredProposals.get(0), (char) 0, 0, fInvocationOffset);
+ if (count == 1 && canAutoInsert(proposals.get(0))) {
+ insertProposal(proposals.get(0), (char) 0, 0, fInvocationOffset);
hide();
} else {
ensureDocumentListenerInstalled();
if (count > 0 && completeCommonPrefix())
hide();
else {
- fComputedProposals= fFilteredProposals;
+ fComputedProposals= proposals;
createProposalSelector();
setProposals(fComputedProposals, false);
displayProposals();