Pārlūkot izejas kodu

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 gadi atpakaļ
vecāks
revīzija
744ccd5c48
3 mainītis faili ar 30 papildinājumiem un 30 dzēšanām
  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)