From 744ccd5c485d2e4927858f328170dfc0ec23a52f Mon Sep 17 00:00:00 2001 From: Jake Smith Date: Thu, 1 Jun 2017 15:23:01 +0100 Subject: [PATCH] HPCC-17721 Ensure serialized lengths have correct endian format. The compression to MemoryBuffer routines were raw writing the lengths, but their counter part deserialization methods were deserializing them with MemoryBuffer methods. This results in corrupt values if the endianness of the MemoryBuffer was swapped. Signed-off-by: Jake Smith --- system/jlib/jflz.cpp | 17 +++++++++-------- system/jlib/jlz4.cpp | 25 +++++++++++-------------- system/jlib/jlzma.cpp | 18 ++++++++++-------- 3 files changed, 30 insertions(+), 30 deletions(-) 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)