RFR: 6187113: DefaultListSelectionModel.removeIndexInterval(0, Integer.MAX_VALUE) fails
Alexey Ivanov
aivanov at openjdk.org
Wed Sep 28 08:52:24 UTC 2022
On Fri, 23 Sep 2022 13:19:01 GMT, Prasanta Sadhukhan <psadhukhan at openjdk.org> 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.
Changes requested by aivanov (Reviewer).
src/java.desktop/share/classes/javax/swing/DefaultListSelectionModel.java line 695:
> 693: int rmMaxIndex = Math.max(index0, index1);
> 694: int gapLength = ((rmMaxIndex - rmMinIndex) + 1) > (rmMaxIndex - rmMinIndex)
> 695: ? ((rmMaxIndex - rmMinIndex) + 1) : (rmMaxIndex - rmMinIndex);
I wonder if the model supports selections of 0 .. Integer.MAX_VALUE, it should … but it doesn't. If I call
selectionModel.setSelectionInterval(Integer.MAX_VALUE - 1, Integer.MAX_VALUE);
it never returns, it goes into an infinite loop in `changeSelection` because the condition `i <= Math.max(setMax, clearMax)` is always `true` if either `setMax` or `clearMax` is `Integer.MAX_VALUE`. Therefore, we should prevent that from happening. With that in mind, for `removeIndexInterval`, the value of `Integer.MAX_VALUE` becomes invalid.
What will happen if negative values are passed, in particular `Integer.MIN_VALUE`?
src/java.desktop/share/classes/javax/swing/DefaultListSelectionModel.java line 705:
> 703: } else {
> 704: setState(i, value.get(gapLength));
> 705: }
~~If `rmMaxIndex == Integer.MAX_VALUE - 1`, the code to remove the interval in the gap could remain the same. If `rmMaxIndex == Integer.MAX_VALUE`, the value of `gapLength` could be set to a value as if `rmMaxIndex == Integer.MAX_VALUE - 1`, then one more value is to be moved `setState(Integer.MAX_VALUE - gapLength, value.get(Integer.MAX_VALUE)` provided that `Integer.MAX_VALUE - gapLength <= maxIndex`.~~
This has become irrelevant taking into account my comment above that the model can't support selections up to and including `Integer.MAX_VALUE`.
test/jdk/javax/swing/TestDefListModelExcpn.java line 32:
> 30: import javax.swing.DefaultListSelectionModel;
> 31:
> 32: public class TestDefListModelExcpn {
Why not spell `Exception`?
test/jdk/javax/swing/TestDefListModelExcpn.java line 37:
> 35: selectionModel.setSelectionInterval(0, 1);
> 36: selectionModel.removeIndexInterval(0, Integer.MAX_VALUE);
> 37: }
A comment would help to understand that an exception was thrown and *no exception is expected*.
`throws Exception` in `main` declaration can be removed to hint at this too.
-------------
PR: https://git.openjdk.org/jdk/pull/10409
More information about the client-libs-dev
mailing list