On Tue, 18 Oct 2022 04:56:07 GMT, Prasanta Sadhukhan <[email protected]> 
wrote:

>> DefaultListSelectionModel.removeIndexInterva accepts `int` value which 
>> allows it to take in Integer.MAX_VALUE theoratically but it does calculation 
>> with that value which can results in IOOBE.
>> Fix is to make sure the calculation stays within bounds.
>
> Prasanta Sadhukhan has updated the pull request incrementally with one 
> additional commit since the last revision:
> 
>   insertIndexInterval fix. Add more subtests

This is tough. The number of test cases has grown to 25. There are many 
failures.

src/java.desktop/share/classes/javax/swing/DefaultListSelectionModel.java line 
455:

> 453:             if (i + 1 < i) {
> 454:                 break;
> 455:             }

I would rather add `i >= 0` to the loop condition. Yet I can't see why the 
reversed loop doesn't work.

src/java.desktop/share/classes/javax/swing/DefaultListSelectionModel.java line 
660:

> 658:          * insMinIndex).
> 659:          */
> 660:         for(int i = maxIndex; i >= insMinIndex; i--) {

`insertIndexInterval` doesn't verify its parameters: negative `index`, negative 
`length` should be rejected right away.

src/java.desktop/share/classes/javax/swing/DefaultListSelectionModel.java line 
661:

> 659:          */
> 660:         for(int i = maxIndex; i >= insMinIndex; i--) {
> 661:             if ((i + length) >= length) {

I suggest using `i <= Integer.MAX_VALUE - length`. Yet I'm still unsure it's 
enough and *correct*.

src/java.desktop/share/classes/javax/swing/DefaultListSelectionModel.java line 
664:

> 662:                 setState(i + length, value.get(i));
> 663:             } else {
> 664:                 setState(i, value.get(i));

This operation in the `else` block doesn't make sense, you can just skip it.

src/java.desktop/share/classes/javax/swing/DefaultListSelectionModel.java line 
721:

> 719:                 setState(i, value.get(gapLength));
> 720:                 break;
> 721:             }

This does not work. It must not break. With this code, 5 of my tests fail.

For example,


        selectionModel.setSelectionInterval(0, Integer.MAX_VALUE);
        selectionModel.removeIndexInterval(0, Integer.MAX_VALUE);

must result in empty selection. All the possible indexes were selected, you 
removed all the possible indexes (so that “the list” contains no elements at 
all). This test case fails either way, unfortunately: 
`selectionModel.isSelectedIndex(0)` still returns `true`.

This edge case where `rmMinIndex = 0` and `rmMaxIndex = Integer.MAX_VALUE` 
should probably be short-circuited: `setState(i, false)` for all the elements. 
Other values are handled correctly by my suggested code, as far as I can see.

This test case:

        selectionModel.setSelectionInterval(0, Integer.MAX_VALUE);
        selectionModel.removeIndexInterval(1, Integer.MAX_VALUE);

passed before and now it fails again. Here, `selectionModel.isSelectedIndex(0)` 
must be `true`.

test/jdk/javax/swing/TestDefListModelException.java line 62:

> 60:         DefaultListSelectionModel selectionModel = new 
> DefaultListSelectionModel();
> 61:         selectionModel.setSelectionInterval(Integer.MAX_VALUE - 1, 
> Integer.MAX_VALUE);
> 62:         selectionModel.insertIndexInterval(Integer.MAX_VALUE - 1, 
> Integer.MAX_VALUE, true);

I think testing that it does not throw an exception is not enough. You should 
verify that the data selection model holds is correct.

According to the spec, the interval from `Integer.MAX_VALUE - 1` to 
`Integer.MAX_VALUE` should remain selected.

-------------

Changes requested by aivanov (Reviewer).

PR: https://git.openjdk.org/jdk/pull/10409

Reply via email to