diff --git a/system/jlib/jflz.cpp b/system/jlib/jflz.cpp index 952d017c729..7b5a240bb0e 100644 --- a/system/jlib/jflz.cpp +++ b/system/jlib/jflz.cpp @@ -703,16 +703,17 @@ class jlib_decl CFastLZExpander : public CFcmpExpander void fastLZCompressToBuffer(MemoryBuffer & out, size32_t len, const void * src) { size32_t outbase = out.length(); - size32_t *sz = (size32_t *)out.reserve(len+fastlzSlack(len)+sizeof(size32_t)*2); - *sz = len; - sz++; - *sz = (len>16)?fastlz_compress(src, (int)len, sz+1):16; - if (*sz>=len) + out.append(len); + DelayedMarker cmpSzMarker(out); + void *cmpData = out.reserve(len+fastlzSlack(len)); + size32_t sz = (len>16)?fastlz_compress(src, (int)len, cmpData):16; + if (sz>=len) { - *sz = len; - memcpy(sz+1,src,len); + sz = len; + memcpy(cmpData, src, len); } - out.setLength(outbase+*sz+sizeof(size32_t)*2); + cmpSzMarker.write(sz); + out.setLength(outbase+sz+sizeof(size32_t)*2); } void fastLZDecompressToBuffer(MemoryBuffer & out, const void * src) diff --git a/system/jlib/jlz4.cpp b/system/jlib/jlz4.cpp index 07a8a54c6f7..c3c20c718f6 100644 --- a/system/jlib/jlz4.cpp +++ b/system/jlib/jlz4.cpp @@ -147,24 +147,21 @@ class jlib_decl CLZ4Expander : public CFcmpExpander void LZ4CompressToBuffer(MemoryBuffer & out, size32_t len, const void * src) { size32_t outbase = out.length(); - size32_t *sz = (size32_t *)out.reserve(LZ4_COMPRESSBOUND(len)+sizeof(size32_t)*2); - *sz = len; - sz++; + out.append(len); + DelayedMarker cmpSzMarker(out); + void *cmpData = out.reserve(LZ4_COMPRESSBOUND(len)); if (len < 64) - { - *sz = len; - memcpy(sz+1,src,len); - } + memcpy(cmpData, src, len); else { - *sz = LZ4_compress_default((const char *)src, (char *)(sz+1), len, LZ4_COMPRESSBOUND(len)); - if (!*sz) - { - *sz = len; - memcpy(sz+1,src,len); - } + size32_t cmpSz = LZ4_compress_default((const char *)src, (char *)cmpData, len, LZ4_COMPRESSBOUND(len)); + if (!cmpSz) + memcpy(cmpData, src, len); + else + len = cmpSz; } - out.setLength(outbase+*sz+sizeof(size32_t)*2); + cmpSzMarker.write(len); + out.setLength(outbase+len+sizeof(size32_t)*2); } void LZ4DecompressToBuffer(MemoryBuffer & out, const void * src) diff --git a/system/jlib/jlzma.cpp b/system/jlib/jlzma.cpp index 0f53e137b2b..46fe6b4cb7c 100644 --- a/system/jlib/jlzma.cpp +++ b/system/jlib/jlzma.cpp @@ -95,16 +95,18 @@ void LZMACompressToBuffer(MemoryBuffer & out, size32_t len, const void * src) { CLZMA lzma; size32_t outbase = out.length(); - size32_t *sz = (size32_t *)out.reserve(len+sizeof(size32_t)*2); - *sz = len; - sz++; - *sz = lzma.compress(src,len,sz+1); - if (*sz>len) { - *sz = len; - memcpy(sz+1,src,len); + out.append(len); + DelayedMarker cmpSzMarker(out); + void *cmpData = out.reserve(len); + size32_t sz = lzma.compress(src, len, cmpData); + if (sz>len) + { + sz = len; + memcpy(cmpData, src, len); } else - out.setLength(outbase+sizeof(size32_t)*2+*sz); + out.setLength(outbase+sizeof(size32_t)*2+sz); + cmpSzMarker.write(sz); } void LZMADecompressToBuffer(MemoryBuffer & out, const void * src)