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();