From 9dba267ce4e80be1d108ad9ccc031e5d18cd5250 Mon Sep 17 00:00:00 2001 From: Rika <34874943+IJARika@users.noreply.github.com> Date: Thu, 23 Oct 2025 16:16:23 -0400 Subject: [PATCH] Fix Pak_ExtractAssetStem fix handling backslashes and add prefix input to verify the path contains a prefix --- src/assets/shader.cpp | 2 +- src/assets/shaderset.cpp | 2 +- src/assets/texture.cpp | 2 +- src/utils/utils.cpp | 19 ++++++++++++------- src/utils/utils.h | 2 +- 5 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/assets/shader.cpp b/src/assets/shader.cpp index e948a74b..281d4521 100644 --- a/src/assets/shader.cpp +++ b/src/assets/shader.cpp @@ -143,7 +143,7 @@ static void Shader_InternalAddShader(CPakFileBuilder* const pak, const char* con const char* const targetName = shader->name.length() > 0 ? shader->name.c_str() : assetPath; char pathStem[PAK_MAX_STEM_PATH]; - const size_t stemLen = Pak_ExtractAssetStem(targetName, pathStem, sizeof(pathStem)); + const size_t stemLen = Pak_ExtractAssetStem(targetName, pathStem, sizeof(pathStem), "shader"); if (stemLen > 0) { diff --git a/src/assets/shaderset.cpp b/src/assets/shaderset.cpp index bbb1991d..c3195708 100644 --- a/src/assets/shaderset.cpp +++ b/src/assets/shaderset.cpp @@ -70,7 +70,7 @@ void ShaderSet_InternalCreateSet(CPakFileBuilder* const pak, const char* const a if (pak->IsFlagSet(PF_KEEP_DEV)) { char pathStem[PAK_MAX_STEM_PATH]; - const size_t stemLen = Pak_ExtractAssetStem(assetPath, pathStem, sizeof(pathStem)); + const size_t stemLen = Pak_ExtractAssetStem(assetPath, pathStem, sizeof(pathStem), "shaderset"); if (stemLen > 0) { diff --git a/src/assets/texture.cpp b/src/assets/texture.cpp index ff63a594..0b1eff9c 100644 --- a/src/assets/texture.cpp +++ b/src/assets/texture.cpp @@ -319,7 +319,7 @@ static void Texture_InternalAddTexture(CPakFileBuilder* const pak, const PakGuid if (pak->IsFlagSet(PF_KEEP_DEV)) { char pathStem[PAK_MAX_STEM_PATH]; - const size_t stemLen = Pak_ExtractAssetStem(assetPath, pathStem, sizeof(pathStem)); + const size_t stemLen = Pak_ExtractAssetStem(assetPath, pathStem, sizeof(pathStem), "texture"); if (stemLen > 0) { diff --git a/src/utils/utils.cpp b/src/utils/utils.cpp index 567279ab..0f6a26d3 100644 --- a/src/utils/utils.cpp +++ b/src/utils/utils.cpp @@ -294,15 +294,20 @@ PakGuid_t Pak_ParseGuidFromMap(const rapidjson::Value& mapEntry, rapidjson::Valu return Pak_ParseGuidFromObject(it->value, debugName, outAssetName); } -size_t Pak_ExtractAssetStem(const char* const assetPath, char* const outBuf, const size_t outBufLen) +size_t Pak_ExtractAssetStem(const char* const assetPath, char* const outBuf, const size_t outBufLen, const char* const assetPrefix) { - // skip 'texture/' - const char* bufPos = strchr(assetPath, '/'); + const char* bufPos = assetPath; - if (!bufPos) - bufPos = assetPath; - else - bufPos += 1; // skip the '/'. + // check if the path has the desired prefix + if (strstr(assetPath, assetPrefix)) + { + const size_t prefixLength = strnlen(assetPrefix, 32ull); + + assert(bufPos[prefixLength] == '/' || bufPos[prefixLength] == '\\'); + + // add one to skip the (back)slash + bufPos += (prefixLength + 1); + } // copy until '.rpak' or '\0' size_t i = 0; diff --git a/src/utils/utils.h b/src/utils/utils.h index 07358b82..4c2fb5ad 100644 --- a/src/utils/utils.h +++ b/src/utils/utils.h @@ -33,7 +33,7 @@ extern PakGuid_t Pak_ParseGuidFromObject(const rapidjson::Value& val, const char extern PakGuid_t Pak_ParseGuidFromMap(const rapidjson::Value& mapEntry, rapidjson::Value::StringRefType fieldName, const char* const debugName, const char*& outAssetName, const bool requiredField); -extern size_t Pak_ExtractAssetStem(const char* const assetPath, char* const outBuf, const size_t outBufLen); +extern size_t Pak_ExtractAssetStem(const char* const assetPath, char* const outBuf, const size_t outBufLen, const char* const assetPrefix); using namespace std::chrono;