From 6ba47157fe67423b120538d7a522ca880a51adbd Mon Sep 17 00:00:00 2001 From: Almas Baimagambetov Date: Tue, 28 Feb 2023 19:38:20 +0000 Subject: [PATCH] fix: original asset objects are now cast during first load to avoid leaking originals where we shouldnt, #977 --- .../almasb/fxgl/app/services/FXGLAssetLoaderService.kt | 8 +++++++- .../kotlin/com/almasb/fxgl/app/AssetLoaderServiceTest.kt | 3 ++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/fxgl/src/main/kotlin/com/almasb/fxgl/app/services/FXGLAssetLoaderService.kt b/fxgl/src/main/kotlin/com/almasb/fxgl/app/services/FXGLAssetLoaderService.kt index 38b4b7562..1e3d2b4e2 100644 --- a/fxgl/src/main/kotlin/com/almasb/fxgl/app/services/FXGLAssetLoaderService.kt +++ b/fxgl/src/main/kotlin/com/almasb/fxgl/app/services/FXGLAssetLoaderService.kt @@ -533,7 +533,7 @@ class FXGLAssetLoaderService : AssetLoaderService() { cachedAssets[cacheKey] = loaded as Any } - loaded + data.cast(loaded as Any) } catch (e: Exception) { log.warning("Failed to load ${loadParams.url}", e) data.getDummy() @@ -696,6 +696,12 @@ private class TextAssetLoader : AssetLoader>( List::class.java, TEXT_DIR ) { + override fun cast(obj: Any): List { + val list = obj as List + + return list.toList() + } + override fun load(url: URL): List = url.openStream().bufferedReader().readLines() override fun getDummy(): List = emptyList() diff --git a/fxgl/src/test/kotlin/com/almasb/fxgl/app/AssetLoaderServiceTest.kt b/fxgl/src/test/kotlin/com/almasb/fxgl/app/AssetLoaderServiceTest.kt index 2bd7068ef..5b6eaad68 100644 --- a/fxgl/src/test/kotlin/com/almasb/fxgl/app/AssetLoaderServiceTest.kt +++ b/fxgl/src/test/kotlin/com/almasb/fxgl/app/AssetLoaderServiceTest.kt @@ -185,7 +185,8 @@ class AssetLoaderServiceTest { assertThat(lines.size, `is`(0)) - assertTrue(assetLoader.loadText("test1.txt") === assetLoader.loadText("test1.txt")) + // ensure a new copy of the list is loaded so that original cannot be modified + assertTrue(assetLoader.loadText("test1.txt") !== assetLoader.loadText("test1.txt")) } @Test