Buggy code:
class ProgressInfoItem extends Composite { static String STOP_IMAGE_KEY = "org.eclipse.ui.internal.progress.PROGRESS_STOP" ; static String DISABLED_STOP_IMAGE_KEY = "org.eclipse.ui.internal.progress.DISABLED_PROGRESS_STOP" ; static String CLEAR_FINISHED_JOB_KEY = "org.eclipse.ui.internal.progress.CLEAR_FINISHED_JOB" ; static String DISABLED_CLEAR_FINISHED_JOB_KEY = "org.eclipse.ui.internal.progress.DISABLED_CLEAR_FINISHED_JOB" ; static String DEFAULT_JOB_KEY = "org.eclipse.ui.internal.progress.PROGRESS_DEFAULT" ; static String DARK_COLOR_KEY = "org.eclipse.ui.internal.progress.PROGRESS_DARK_COLOR" ; JobTreeElement info ; Label progressLabel ; ToolBar actionBar ; ToolItem actionButton ; List taskEntries = new ArrayList ( 0 ) ; private ProgressBar progressBar ; private Label jobImageLabel ; static final int MAX_PROGRESS_HEIGHT = 12 ; static final int MIN_ICON_SIZE = 16 ; private static final String EMPTY_STRING = "" ; private static final String TEXT_KEY = "Text" ; private static final String ACTION_KEY = "Action" ; interface IndexListener { public void selectPrevious ( ) { } public void selectNext ( ) { } public void select ( ) { } } ProgressInfoItem . IndexListener indexListener ; private int currentIndex ; private boolean selected ; private MouseAdapter mouseListener ; public ProgressInfoItem ( Composite parent , int style , JobTreeElement progressInfo ) { } protected void createChildren ( ) { } private void setLayoutsForNoProgress ( ) { } protected void cancelOrRemove ( ) { } private Image getInfoImage ( ) { } private String getMainTitle ( ) { } protected String getJobNameAndStatus ( ) { } String getJobInfoFinishedString ( Job job , boolean withTime ) { } private String getTimeString ( ) { } void refresh ( ) { if ( isDisposed ( ) ) { return ; } progressLabel . setText ( getMainTitle ( ) ) ; int percentDone = getPercentDone ( ) ; JobInfo [ ] infos = getJobInfos ( ) ; if ( isRunning ( ) ) { if ( ( progressBar ) == null ) { if ( percentDone == ( IProgressMonitor . UNKNOWN ) ) { for ( int i = 0 ; i < ( infos . length ) ; i ++ ) { if ( ( infos [ i ] . hasTaskInfo ( ) ) && ( ( infos [ i ] . getTaskInfo ( ) . totalWork ) == ( IProgressMonitor . UNKNOWN ) ) ) { createProgressBar ( INDETERMINATE ) ; break ; } } } else { createProgressBar ( NONE ) ; progressBar . setMinimum ( 0 ) ; progressBar . setMaximum ( 100 ) ; } } if ( ( ( percentDone >= 0 ) && ( percentDone <= 100 ) ) && ( percentDone != ( progressBar . getSelection ( ) ) ) ) { progressBar . setSelection ( percentDone ) ; } } else if ( isCompleted ( ) ) { if ( ( progressBar ) != null ) { progressBar . dispose ( ) ; progressBar = null ; } setLayoutsForNoProgress ( ) ; actionButton . setImage ( JFaceResources . getImage ( ProgressInfoItem . CLEAR_FINISHED_JOB_KEY ) ) ; actionButton . setDisabledImage ( JFaceResources . getImage ( ProgressInfoItem . DISABLED_CLEAR_FINISHED_JOB_KEY ) ) ; } for ( int i = 0 ; i < ( infos . length ) ; i ++ ) { JobInfo jobInfo = infos [ i ] ; if ( jobInfo . hasTaskInfo ( ) ) { String taskString = jobInfo . getTaskInfo ( ) . getTaskName ( ) ; String subTaskString = null ; Object [ ] jobChildren = jobInfo . getChildren ( ) ; if ( ( jobChildren . length ) > 0 ) { subTaskString = ( ( JobTreeElement ) ( jobChildren [ 0 ] ) ) . getDisplayString ( ) ; } if ( subTaskString != null ) { if ( taskString == null ) { taskString = subTaskString ; } else { taskString = NLS . bind ( JobInfo_DoneNoProgressMessage , taskString , subTaskString ) ; } } if ( taskString != null ) { setLinkText ( infos [ i ] . getJob ( ) , taskString , i ) ; } } else { Job job = jobInfo . getJob ( ) ; if ( ( job . getResult ( ) ) != null ) { IStatus result = job . getResult ( ) ; String message = ProgressInfoItem . EMPTY_STRING ; if ( result != null ) { message = result . getMessage ( ) ; } setLinkText ( job , message , i ) ; } } setColor ( i ) ; } if ( ( infos . length ) < ( taskEntries . size ( ) ) ) { <START_BUG> for ( int i = ( infos . length ) + 1 ; i < ( taskEntries . size ( ) ) ; i ++ ) { <END_BUG> ( ( Link ) ( taskEntries . get ( i ) ) ) . dispose ( ) ; } if ( ( infos . length ) > 1 ) taskEntries = taskEntries . subList ( 0 , ( ( infos . length ) - 1 ) ) ; else taskEntries . clear ( ) ; } } private boolean isCompleted ( ) { } private JobInfo [ ] getJobInfos ( ) { } private boolean isRunning ( ) { } private int getPercentDone ( ) { } private void setToolBarImages ( ) { } void createProgressBar ( int style ) { } void setLinkText ( Job linkJob , String taskString , int index ) { } private void updateText ( String taskString , Link link ) { } public void setColor ( int i ) { } private void setAllForegrounds ( Color color ) { } private void setAllBackgrounds ( Color color ) { } void setButtonFocus ( ) { } void selectWidgets ( boolean select ) { } void setIndexListener ( ProgressInfoItem . IndexListener indexListener ) { } boolean isSelected ( ) { } }

Fix:
for ( int i = infos . length ; i < ( taskEntries . size ( ) ) ; i ++ ) {