浏览代码

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 <jake.smith@lexisnexisrisk.com>
Jake Smith 8 年之前
父节点
当前提交
744ccd5c48
共有 3 个文件被更改,包括 30 次插入30 次删除
  1. 9 8
      system/jlib/jflz.cpp
  2. 11 14
      system/jlib/jlz4.cpp
  3. 10 8
      system/jlib/jlzma.cpp

+ 9 - 8
system/jlib/jflz.cpp

@@ -703,16 +703,17 @@ public:
 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<size32_t> 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)

+ 11 - 14
system/jlib/jlz4.cpp

@@ -147,24 +147,21 @@ public:
 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<size32_t> 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)

+ 10 - 8
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<size32_t> 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)