RFR: 8336389: Infinite loop occurs while resolving lookups [v2]

Andy Goryachev angorya at openjdk.org
Tue Jul 16 17:10:03 UTC 2024


On Mon, 15 Jul 2024 13:30:13 GMT, John Hendrikx <jhendrikx at openjdk.org> wrote:

>> Fixes an infinite loop that can occur while resolving lookups.
>> 
>> There were 2 bugs:
>> - A `contains` check was done on some value X, but then a value Y was added to the set used to track duplicates
>> - The `Set` to track duplicates was cleared in some recursive calls, meaning that the caller (which may be processing multiple values in a loop) would end up with an empty set, losing track of what was visited so far
>> 
>> Also removed a redundant `null` check (an NPE would have occurred before it could reach that code).
>
> John Hendrikx has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Fix formatting and spelling

LGTM.

The fix does not cause SOE but instead detects the loop, outputting the explanation to stderr:


Jul 16, 2024 10:05:52 AM javafx.scene.CssStyleHelper resolveLookups
WARNING: Loop detected in *.root{
	-fx-base-fill: <Value>
  <value values="3">
    <Value lookup="true">
      <value>-fx-base</value>
      <converter>null</converter>
    </Value>    <Value>
      <value values="2">
        <Value>
          <value>49.0%</value>
          <converter>null</converter>
        </Value>        <Value>
          <value>0xffffffff</value>
          <converter>null</converter>
        </Value>      </value>
      <converter>StopConverter</converter>
    </Value>    <Value>
      <value values="2">
        <Value>
          <value>50.0%</value>
          <converter>null</converter>
        </Value>        <Value>
          <value>0x000000ff</value>
          <converter>null</converter>
        </Value>      </value>
      <converter>StopConverter</converter>
    </Value>  </value>
  <converter>LadderConverter</converter>
</Value>
	-fx-base: <Value>
  <value values="3">
    <Value lookup="true">
      <value>-fx-base-fill</value>
      <converter>null</converter>
    </Value>    <Value>
      <value values="2">
        <Value>
          <value>49.0%</value>
          <converter>null</converter>
        </Value>        <Value>
          <value>0xffffffff</value>
          <converter>null</converter>
        </Value>      </value>
      <converter>StopConverter</converter>
    </Value>    <Value>
      <value values="2">
        <Value>
          <value>50.0%</value>
          <converter>null</converter>
        </Value>        <Value>
          <value>0x000000ff</value>
          <converter>null</converter>
        </Value>      </value>
      <converter>StopConverter</converter>
    </Value>  </value>
  <converter>LadderConverter</converter>
</Value>
} while resolving '-fx-base'
Jul 16, 2024 10:05:52 AM javafx.scene.CssStyleHelper calculateValue
WARNING: Caught java.lang.IllegalArgumentException: Loop detected in *.root{
	-fx-base-fill: <Value>
  <value values="3">
    <Value lookup="true">
      <value>-fx-base</value>
      <converter>null</converter>
    </Value>    <Value>
      <value values="2">
        <Value>
          <value>49.0%</value>
          <converter>null</converter>
        </Value>        <Value>
          <value>0xffffffff</value>
          <converter>null</converter>
        </Value>      </value>
      <converter>StopConverter</converter>
    </Value>    <Value>
      <value values="2">
        <Value>
          <value>50.0%</value>
          <converter>null</converter>
        </Value>        <Value>
          <value>0x000000ff</value>
          <converter>null</converter>
        </Value>      </value>
      <converter>StopConverter</converter>
    </Value>  </value>
  <converter>LadderConverter</converter>
</Value>
	-fx-base: <Value>
  <value values="3">
    <Value lookup="true">
      <value>-fx-base-fill</value>
      <converter>null</converter>
    </Value>    <Value>
      <value values="2">
        <Value>
          <value>49.0%</value>
          <converter>null</converter>
        </Value>        <Value>
          <value>0xffffffff</value>
          <converter>null</converter>
        </Value>      </value>
      <converter>StopConverter</converter>
    </Value>    <Value>
      <value values="2">
        <Value>
          <value>50.0%</value>
          <converter>null</converter>
        </Value>        <Value>
          <value>0x000000ff</value>
          <converter>null</converter>
        </Value>      </value>
      <converter>StopConverter</converter>
    </Value>  </value>
  <converter>LadderConverter</converter>
</Value>
} while resolving '-fx-base'' while calculating value for '-fx-background-color' from style '*.pane { -fx-background-color: <Value>
  <value values="1">
    <Value lookup="true">
      <value>-fx-base</value>
      <converter>null</converter>
    </Value>  </value>
  <converter>Paint.SequenceConverter</converter>
</Value> } '


Also added a reproducer to the ticket, which goes through the code path normally used by the application.

modules/javafx.graphics/src/test/java/test/javafx/scene/CssStyleHelperTest.java line 691:

> 689:     @Test
> 690:     public void shouldDetectNestedInfiniteLoop() throws IOException {
> 691:         Stylesheet stylesheet = new CssParser().parse(

`CssParser.parse(String,String)` is used only in tests, why are we using it?  Shouldn't we use `CssParser.parse(String)` instead?

Also, why do we need `CssParser.parse(String,String)` in the first place?

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

Marked as reviewed by angorya (Reviewer).

PR Review: https://git.openjdk.org/jfx/pull/1505#pullrequestreview-2180820690
PR Review Comment: https://git.openjdk.org/jfx/pull/1505#discussion_r1679759718


More information about the openjfx-dev mailing list