Browse Source

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 years ago
parent
commit
744ccd5c48
3 changed files with 30 additions and 30 deletions
  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)