RFR: 8347753: VetoableListDecorator doesn't accept its own sublists for bulk operations

Andy Goryachev angorya at openjdk.org
Thu Jan 16 16:59:42 UTC 2025


On Thu, 16 Jan 2025 00:31:16 GMT, Michael Strauß <mstrauss at openjdk.org> wrote:

>> modules/javafx.base/src/main/java/com/sun/javafx/collections/VetoableListDecorator.java line 391:
>> 
>>> 389: 
>>> 390:     /**
>>> 391:      * Returns the specified collection as an unmodifiable list that can safely be used in all bulk
>> 
>> Do you think it might be easier to create a defensive copy **always**?
>> 
>> In other words, can we guarantee that it is impossible for the user to create a convoluted code involving maybe two `VetoableListDecorators` where the second one loops back the changes to the first one, however ridiculous that might sound?
>
> The way I see it, the situation that erroneously triggers `ConcurrentModificationException` only happens when `VetoableListDecorator` accesses its own sublist:
> 
>     try {
>         modCount++;
>         boolean ret = list.addAll(index, c); // --> c is its own sublist
>         ...
> 
> 
> Since `modCount` is modified first, and the sublist refers back to the same modified `modCount`, the exception occurs. It can't occur when we are dealing with another list (or a sublist of another list), since in this case there is no self-referential conflict.
> 
> The way `ArrayList` circumvents this problem is by incrementing `modCount` only after the operation is done, not before it has started; it doesn't create a defensive copy.

Thank you for clarification!  I'll try to come up with a test (and I think even if I succeed, it does not mean that your solution is not good, since the caller can always create a defensive copy themselves).

BTW, what were you doing to trigger this bug?

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

PR Review Comment: https://git.openjdk.org/jfx/pull/1679#discussion_r1918896531


More information about the openjfx-dev mailing list