From fdf37668b02e640a32ac7d5796ac1910ce0eb11f Mon Sep 17 00:00:00 2001 From: HugeFrog24 <62775760+HugeFrog24@users.noreply.github.com> Date: Sat, 28 Mar 2026 01:41:34 +0100 Subject: [PATCH] Fix null-termination and resource leaks in asset loading CipherUtils::readAsset(): allocate +1 for null terminator, close AAsset on malloc and read failure paths. IconLoader::uploadImageKtx(): fix dangling stack reference in die() by using a static sentinel, close AAsset and free buffer on all error paths, add missing return on glGenTextures failure. --- app/src/main/cpp/Core/Cipher/CipherUtils.cpp | 6 ++++-- app/src/main/cpp/Core/Iconloader/IconLoader.cpp | 10 +++++----- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/app/src/main/cpp/Core/Cipher/CipherUtils.cpp b/app/src/main/cpp/Core/Cipher/CipherUtils.cpp index d1aa5a5..7aadbc5 100644 --- a/app/src/main/cpp/Core/Cipher/CipherUtils.cpp +++ b/app/src/main/cpp/Core/Cipher/CipherUtils.cpp @@ -257,15 +257,17 @@ char* CipherUtils::readAsset(const char* _assetPath) { } size_t asset_size = AAsset_getLength64(aAsset); - void* asset_buffer = malloc(asset_size); - if (asset_buffer == nullptr) return nullptr; // no mem? + void* asset_buffer = malloc(asset_size + 1); + if (asset_buffer == nullptr) { AAsset_close(aAsset); return nullptr; } if (AAsset_read(aAsset, asset_buffer, asset_size) != asset_size) { free(asset_buffer); + AAsset_close(aAsset); return nullptr; } AAsset_close(aAsset); + ((char*)asset_buffer)[asset_size] = '\0'; return (char*)asset_buffer; } diff --git a/app/src/main/cpp/Core/Iconloader/IconLoader.cpp b/app/src/main/cpp/Core/Iconloader/IconLoader.cpp index d18a4bd..78ba2ed 100644 --- a/app/src/main/cpp/Core/Iconloader/IconLoader.cpp +++ b/app/src/main/cpp/Core/Iconloader/IconLoader.cpp @@ -39,7 +39,7 @@ Java_git_artdeell_skymodloader_iconloader_IconLoader_addIcon( } PRIVATE_API SkyImage& die() { - SkyImage image; + static SkyImage image; image.textureId = (ImTextureID)-1; return image; } @@ -60,15 +60,15 @@ PRIVATE_API SkyImage& IconLoader::uploadImageKtx(const char* name, const bool& i size_t assetSz = AAsset_getLength64(aAsset); void* assetBuf = malloc(assetSz); - if(assetBuf == nullptr) return die(); - if(AAsset_read(aAsset, assetBuf, assetSz) != assetSz) return die(); + if(assetBuf == nullptr) { AAsset_close(aAsset); return die(); } + if(AAsset_read(aAsset, assetBuf, assetSz) != assetSz) { free(assetBuf); AAsset_close(aAsset); return die(); } AAsset_close(aAsset); ktxTexture* texture = nullptr; GLuint texid = -1; GLenum target, error; - if(ktxTexture_CreateFromMemory((const ktx_uint8_t *)assetBuf, assetSz, KTX_TEXTURE_CREATE_NO_FLAGS, &texture) != KTX_SUCCESS) return die(); + if(ktxTexture_CreateFromMemory((const ktx_uint8_t *)assetBuf, assetSz, KTX_TEXTURE_CREATE_NO_FLAGS, &texture) != KTX_SUCCESS) { free(assetBuf); return die(); } glGenTextures(1, &texid); - if(texid == -1) die(); + if(texid == -1) { free(assetBuf); ktxTexture_Destroy(texture); return die(); } auto *image = new SkyImage; error = glGetError(); while(error != GL_NO_ERROR) {