From cb577f9badacc87912321b0f16902e31aad96c31 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 28 Dec 2025 16:40:17 +0000 Subject: [PATCH 1/5] Initial plan From a358168c39d73037e72efd3067674845a644877b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 28 Dec 2025 16:49:33 +0000 Subject: [PATCH 2/5] Fix Dmod_ReadModuleHeader to handle compressed DMFC files Co-authored-by: JohnAmadis <17320783+JohnAmadis@users.noreply.github.com> --- src/system/dmod_system.c | 69 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 67 insertions(+), 2 deletions(-) diff --git a/src/system/dmod_system.c b/src/system/dmod_system.c index 62fb84f..b2ab327 100644 --- a/src/system/dmod_system.c +++ b/src/system/dmod_system.c @@ -1237,15 +1237,80 @@ bool Dmod_ReadModuleHeader(const char* FilePath, Dmod_ModuleHeader_t* Header) return false; } - if( Dmod_FileRead( Header, sizeof(Dmod_ModuleHeader_t), 1, file ) != 1 ) + // Get file size to check if it's compressed + size_t fileSize = Dmod_FileSize( file ); + if( fileSize < sizeof(Dmod_ModuleHeader_t) ) + { + DMOD_LOG_ERROR("Cannot read module header - file too small\n"); + Dmod_FileClose( file ); + return false; + } + + // Read file into buffer to check for compression + void* buffer = Dmod_Malloc( fileSize ); + if( buffer == NULL ) + { + DMOD_LOG_ERROR("Cannot read module header - cannot allocate memory\n"); + Dmod_FileClose( file ); + return false; + } + + if( Dmod_FileRead( buffer, 1, fileSize, file ) != fileSize ) { - DMOD_LOG_ERROR("Cannot read module header - cannot read header\n"); + DMOD_LOG_ERROR("Cannot read module header - cannot read file\n"); + Dmod_Free( buffer ); Dmod_FileClose( file ); return false; } Dmod_FileClose( file ); + // Check if file is compressed (DMFC) + void* dmfData = buffer; + size_t dmfSize = fileSize; + bool needsFree = false; + + if( Dmod_IsDMFC(buffer, fileSize) ) + { + // Decompress the file + if( !Dmod_FromDMFC(buffer, fileSize, &dmfData, &dmfSize) ) + { + DMOD_LOG_ERROR("Cannot read module header - failed to decompress DMFC file\n"); + Dmod_Free( buffer ); + return false; + } + Dmod_Free( buffer ); + needsFree = true; + } + + // Verify decompressed size is sufficient + if( dmfSize < sizeof(Dmod_ModuleHeader_t) ) + { + DMOD_LOG_ERROR("Cannot read module header - decompressed data too small\n"); + if( needsFree ) + { + Dmod_Free( dmfData ); + } + else + { + Dmod_Free( buffer ); + } + return false; + } + + // Copy header from decompressed data + memcpy( Header, dmfData, sizeof(Dmod_ModuleHeader_t) ); + + // Clean up + if( needsFree ) + { + Dmod_Free( dmfData ); + } + else + { + Dmod_Free( buffer ); + } + return true; } From e9eb5b6ed0e1c0d3af04adf74ad38643a3ae50b3 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 28 Dec 2025 16:52:43 +0000 Subject: [PATCH 3/5] Refactor cleanup logic in Dmod_ReadModuleHeader to eliminate duplication Co-authored-by: JohnAmadis <17320783+JohnAmadis@users.noreply.github.com> --- src/system/dmod_system.c | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/src/system/dmod_system.c b/src/system/dmod_system.c index b2ab327..2a70545 100644 --- a/src/system/dmod_system.c +++ b/src/system/dmod_system.c @@ -1284,22 +1284,17 @@ bool Dmod_ReadModuleHeader(const char* FilePath, Dmod_ModuleHeader_t* Header) } // Verify decompressed size is sufficient + bool success = true; if( dmfSize < sizeof(Dmod_ModuleHeader_t) ) { DMOD_LOG_ERROR("Cannot read module header - decompressed data too small\n"); - if( needsFree ) - { - Dmod_Free( dmfData ); - } - else - { - Dmod_Free( buffer ); - } - return false; + success = false; + } + else + { + // Copy header from decompressed data + memcpy( Header, dmfData, sizeof(Dmod_ModuleHeader_t) ); } - - // Copy header from decompressed data - memcpy( Header, dmfData, sizeof(Dmod_ModuleHeader_t) ); // Clean up if( needsFree ) @@ -1311,7 +1306,7 @@ bool Dmod_ReadModuleHeader(const char* FilePath, Dmod_ModuleHeader_t* Header) Dmod_Free( buffer ); } - return true; + return success; } /** From 2fe1e8c60014aaea5bbdd4c5029f0792cfc64fb3 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 28 Dec 2025 16:54:08 +0000 Subject: [PATCH 4/5] Address code review: fix size check and improve variable naming Co-authored-by: JohnAmadis <17320783+JohnAmadis@users.noreply.github.com> --- src/system/dmod_system.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/system/dmod_system.c b/src/system/dmod_system.c index 2a70545..e2f8248 100644 --- a/src/system/dmod_system.c +++ b/src/system/dmod_system.c @@ -1237,11 +1237,11 @@ bool Dmod_ReadModuleHeader(const char* FilePath, Dmod_ModuleHeader_t* Header) return false; } - // Get file size to check if it's compressed + // Get file size size_t fileSize = Dmod_FileSize( file ); - if( fileSize < sizeof(Dmod_ModuleHeader_t) ) + if( fileSize == 0 ) { - DMOD_LOG_ERROR("Cannot read module header - file too small\n"); + DMOD_LOG_ERROR("Cannot read module header - file is empty\n"); Dmod_FileClose( file ); return false; } @@ -1268,7 +1268,7 @@ bool Dmod_ReadModuleHeader(const char* FilePath, Dmod_ModuleHeader_t* Header) // Check if file is compressed (DMFC) void* dmfData = buffer; size_t dmfSize = fileSize; - bool needsFree = false; + bool dmfDataNeedsFree = false; if( Dmod_IsDMFC(buffer, fileSize) ) { @@ -1280,7 +1280,7 @@ bool Dmod_ReadModuleHeader(const char* FilePath, Dmod_ModuleHeader_t* Header) return false; } Dmod_Free( buffer ); - needsFree = true; + dmfDataNeedsFree = true; } // Verify decompressed size is sufficient @@ -1297,7 +1297,7 @@ bool Dmod_ReadModuleHeader(const char* FilePath, Dmod_ModuleHeader_t* Header) } // Clean up - if( needsFree ) + if( dmfDataNeedsFree ) { Dmod_Free( dmfData ); } From 8c69564bb2ccec23ed8f4d45baec3eeadcc0a460 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 28 Dec 2025 16:55:48 +0000 Subject: [PATCH 5/5] Simplify error handling by removing unnecessary success variable Co-authored-by: JohnAmadis <17320783+JohnAmadis@users.noreply.github.com> --- src/system/dmod_system.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/system/dmod_system.c b/src/system/dmod_system.c index e2f8248..fbc429f 100644 --- a/src/system/dmod_system.c +++ b/src/system/dmod_system.c @@ -1284,18 +1284,24 @@ bool Dmod_ReadModuleHeader(const char* FilePath, Dmod_ModuleHeader_t* Header) } // Verify decompressed size is sufficient - bool success = true; if( dmfSize < sizeof(Dmod_ModuleHeader_t) ) { DMOD_LOG_ERROR("Cannot read module header - decompressed data too small\n"); - success = false; - } - else - { - // Copy header from decompressed data - memcpy( Header, dmfData, sizeof(Dmod_ModuleHeader_t) ); + // Clean up + if( dmfDataNeedsFree ) + { + Dmod_Free( dmfData ); + } + else + { + Dmod_Free( buffer ); + } + return false; } + // Copy header from decompressed data + memcpy( Header, dmfData, sizeof(Dmod_ModuleHeader_t) ); + // Clean up if( dmfDataNeedsFree ) { @@ -1306,7 +1312,7 @@ bool Dmod_ReadModuleHeader(const char* FilePath, Dmod_ModuleHeader_t* Header) Dmod_Free( buffer ); } - return success; + return true; } /**