From a72422da0a979f79956d8fa0656d9bf1f3dc88be Mon Sep 17 00:00:00 2001 From: korenkonder Date: Mon, 17 Jul 2023 10:28:47 +0300 Subject: [PATCH] Fix reading of uncompressed entries in `FArC` --- src/KKdLib/farc.cpp | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/KKdLib/farc.cpp b/src/KKdLib/farc.cpp index b9d5b2f1..e040493e 100644 --- a/src/KKdLib/farc.cpp +++ b/src/KKdLib/farc.cpp @@ -873,10 +873,18 @@ static void farc_unpack_file(farc* f, stream& s, farc_file* ff, bool save, char* s.read(ff->data, ff->size); } else if (f->signature == FARC_FArC) { - ff->data_compressed = force_malloc(ff->size_compressed); - s.read(ff->data_compressed, ff->size_compressed); - deflate::decompress(ff->data_compressed, ff->size_compressed, - &ff->data, &ff->size, deflate::MODE_GZIP); + if (ff->size) { + ff->data_compressed = force_malloc(ff->size_compressed); + s.read(ff->data_compressed, ff->size_compressed); + deflate::decompress(ff->data_compressed, ff->size_compressed, + &ff->data, &ff->size, deflate::MODE_GZIP); + } + else { + ff->data = force_malloc(ff->size_compressed); + s.read(ff->data, ff->size_compressed); + ff->size = ff->size_compressed; + ff->size_compressed = 0; + } } else if (ff->flags) { size_t temp_s = ff->flags & FARC_AES @@ -907,6 +915,18 @@ static void farc_unpack_file(farc* f, stream& s, farc_file* ff, bool save, char* memcpy(ff->data_compressed, (void*)t, ff->size_compressed); deflate::decompress(ff->data_compressed, ff->size_compressed, &ff->data, &ff->size, deflate::MODE_GZIP); + if (ff->size) { + ff->data_compressed = force_malloc(ff->size_compressed); + memcpy(ff->data_compressed, (void*)t, ff->size_compressed); + deflate::decompress(ff->data_compressed, ff->size_compressed, + &ff->data, &ff->size, deflate::MODE_GZIP); + } + else { + ff->data = force_malloc(ff->size_compressed); + memcpy(ff->data, (void*)t, ff->size_compressed); + ff->size = ff->size_compressed; + ff->size_compressed = 0; + } } else { ff->data_compressed = 0;