From f2457109c0d4e20fe5bc51027653d94a698cc57d Mon Sep 17 00:00:00 2001 From: Karl von Randow Date: Wed, 18 Mar 2026 05:42:54 +1300 Subject: [PATCH] Prevent getSliderRenderer w/h side-effects from leaking out of getPainter getSliderRenderer() intentionally modifies the instance w/h fields so that configureLayout() uses the adjusted dimensions for the slider. However, these modified values persisted after getPainter() returned. Save and restore w/h around the call to prevent state leakage. --- .../jnr/aqua/impl/AquaNativePainter.java | 2 ++ .../jnr/aqua/impl/AquaUIPainterBase.java | 17 +++++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/org/violetlib/jnr/aqua/impl/AquaNativePainter.java b/src/org/violetlib/jnr/aqua/impl/AquaNativePainter.java index db81049..7fc0b70 100644 --- a/src/org/violetlib/jnr/aqua/impl/AquaNativePainter.java +++ b/src/org/violetlib/jnr/aqua/impl/AquaNativePainter.java @@ -492,6 +492,8 @@ public void configureAppearance(@NotNull VAppearance appearance) } // NSSlider appears to figure out the orientation from the bounds. + // Note: w/h are modified here so that configureLayout picks up the adjusted dimensions. + // getPainter() saves and restores w/h to prevent these changes from leaking. if (sw == SliderWidget.SLIDER_HORIZONTAL || sw == SliderWidget.SLIDER_HORIZONTAL_RIGHT_TO_LEFT) { if (h >= w) { diff --git a/src/org/violetlib/jnr/aqua/impl/AquaUIPainterBase.java b/src/org/violetlib/jnr/aqua/impl/AquaUIPainterBase.java index 1ffef65..dca2856 100644 --- a/src/org/violetlib/jnr/aqua/impl/AquaUIPainterBase.java +++ b/src/org/violetlib/jnr/aqua/impl/AquaUIPainterBase.java @@ -146,10 +146,19 @@ public int getSliderRenderingVersion() public @NotNull Painter getPainter(@NotNull Configuration g) throws UnsupportedOperationException { - LayoutInfo layoutInfo = uiLayout.getLayoutInfo((LayoutConfiguration) g); - Renderer r = getRenderer(g); - Painter p = getPainter(layoutInfo, g, r); - return customizePainter(p, g, layoutInfo); + // Save and restore w/h because getRenderer may adjust them (see getSliderRenderer) + // and those adjustments must not leak beyond this call. + int savedW = w; + int savedH = h; + try { + LayoutInfo layoutInfo = uiLayout.getLayoutInfo((LayoutConfiguration) g); + Renderer r = getRenderer(g); + Painter p = getPainter(layoutInfo, g, r); + return customizePainter(p, g, layoutInfo); + } finally { + w = savedW; + h = savedH; + } } protected @NotNull Painter customizePainter(@NotNull Painter p, @NotNull Configuration g, @NotNull LayoutInfo layoutInfo)