Fix infinite recursion causing Stack Overflow in TileSet.kt setBounds() #3872
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Problem
The
setBounds(left: Float, bottom: Float, right: Float, top: Float)method inTileSet.ktwas calling itself recursively, causing aStackOverflowErrorwhenever this method was invoked:This resulted in crashes like:
Solution
Fixed the method to directly assign the bounds array instead of calling itself:
This is consistent with the other
setBoundsoverloads in the class:bounds.toTypedArray()Test Coverage
Added comprehensive unit tests (
TileSetTest.kt) covering:setBounds()method variationsThe fix is minimal (1 line changed), surgical, and resolves the critical bug without affecting any other functionality.
Fixes #[issue number]
Warning
Firewall rules blocked me from connecting to one or more addresses (expand for details)
I tried to connect to the following addresses, but was blocked by firewall rules:
dl.google.com/usr/lib/jvm/temurin-17-jdk-amd64/bin/java --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED --add-opens=java.base/java.nio.charset=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED --add-opens=java.xml/javax.xml.namespace=ALL-UNNAMED -Xmx4096M -Dfile.encoding=UTF-8 -Duser.country -Duser.language=en -Duser.variant -cp /home/REDACTED/.gradle/wrapper/dists/gradle-8.14.3-bin/cv11ve7ro1n3o1j4so8xd9n66/gradle-8.14.3/lib/gradle-daemon-main-8.14.3.jar -javaagent:/home/REDACTED/.gradle/wrapper/dists/gradle-8.14.3-bin/cv11ve7ro1n3o1j4so8xd9n66/gradle-8.14.3/lib/agents/gradle-instrumentation-agent-8.14.3.jar org.gradle.launcher.daemon.bootstrap.GradleDaemon 8.14.3(dns block)If you need me to access, download, or install something from one of these locations, you can either:
Original prompt
This section details on the original issue you should resolve
<issue_title>Infinite Recursion causes Stack Overflow in TileSet.kt</issue_title>
<issue_description>### MapLibre Android Version
11.12.1
Android SDK Version
Any version, I was using 16
Device
Any device, I was using Pixel Fold 9
What happened?
maplibre-native/platform/android/MapLibreAndroid/src/main/java/org/maplibre/android/style/sources/TileSet.kt
Line 207 in e928524
This function calls itself infinitely which results in a stack overflow crash:
---------------------------- PROCESS STARTED (7129) for package com.servicenow.requestor ----------------------------
2025-10-09 12:59:32.751 6723-6723 AndroidRuntime com.servicenow.requestor E FATAL EXCEPTION: main
Process: com.servicenow.requestor, PID: 6723
java.lang.StackOverflowError: stack size 8188KB
at org.maplibre.android.style.sources.TileSet.setBounds(TileSet.kt:207)
at org.maplibre.android.style.sources.TileSet.setBounds(TileSet.kt:207)
at org.maplibre.android.style.sources.TileSet.setBounds(TileSet.kt:207)
at org.maplibre.android.style.sources.TileSet.setBounds(TileSet.kt:207)
at org.maplibre.android.style.sources.TileSet.setBounds(TileSet.kt:207)
at org.maplibre.android.style.sources.TileSet.setBounds(TileSet.kt:207)
at org.maplibre.android.style.sources.TileSet.setBounds(TileSet.kt:207)
at org.maplibre.android.style.sources.TileSet.setBounds(TileSet.kt:207)
at org.maplibre.android.style.sources.TileSet.setBounds(TileSet.kt:207)
at org.maplibre.android.style.sources.TileSet.setBounds(TileSet.kt:207)
at org.maplibre.android.style.sources.TileSet.setBounds(TileSet.kt:207)
at org.maplibre.android.style.sources.TileSet.setBounds(TileSet.kt:207)
at org.maplibre.android.style.sources.TileSet.setBounds(TileSet.kt:207)
at org.maplibre.android.style.sources.TileSet.setBounds(TileSet.kt:207)
at org.maplibre.android.style.sources.TileSet.setBounds(TileSet.kt:207)
at org.maplibre.android.style.sources.TileSet.setBounds(TileSet.kt:207)
at org.maplibre.android.style.sources.TileSet.setBounds(TileSet.kt:207)
at org.maplibre.android.style.sources.TileSet.setBounds(TileSet.kt:207)
at org.maplibre.android.style.sources.TileSet.setBounds(TileSet.kt:207)
at org.maplibre.android.style.sources.TileSet.setBounds(TileSet.kt:207)
at org.maplibre.android.style.sources.TileSet.setBounds(TileSet.kt:207)
at org.maplibre.android.style.sources.TileSet.setBounds(TileSet.kt:207)
...
Fixes #3871
💬 Share your feedback on Copilot coding agent for the chance to win a $200 gift card! Click here to start the survey.