Skip to content

Conversation

Copy link
Contributor

Copilot AI commented Oct 9, 2025

Problem

The setBounds(left: Float, bottom: Float, right: Float, top: Float) method in TileSet.kt was calling itself recursively, causing a StackOverflowError whenever this method was invoked:

fun setBounds(left: Float, bottom: Float, right: Float, top: Float) {
    setBounds(left, bottom, right, top)  // ❌ Infinite recursion!
}

This resulted in crashes like:

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)
    ...

Solution

Fixed the method to directly assign the bounds array instead of calling itself:

fun setBounds(left: Float, bottom: Float, right: Float, top: Float) {
    this.bounds = arrayOf(left, bottom, right, top)  // ✅ Direct assignment
}

This is consistent with the other setBounds overloads in the class:

  • The vararg version at line 191 uses bounds.toTypedArray()
  • The array version at line 219 uses direct assignment
  • The LatLngBounds version at line 229 calls the 4-parameter version (which now works correctly)

Test Coverage

Added comprehensive unit tests (TileSetTest.kt) covering:

  • All four setBounds() method variations
  • Explicit verification that the stack overflow bug is fixed
  • Multiple sequential calls to ensure state is properly updated

The 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
    • Triggering command: /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?

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.

Copilot AI changed the title [WIP] Fix infinite recursion causing stack overflow in TileSet.kt Fix infinite recursion causing Stack Overflow in TileSet.kt setBounds() Oct 9, 2025
Copilot AI requested a review from louwers October 9, 2025 18:54
Copilot finished work on behalf of louwers October 9, 2025 18:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Infinite Recursion causes Stack Overflow in TileSet.kt

2 participants