Kaynağa Gözat

Merge pull request #10058 from jakesmith/hpcc-17721

HPCC-17721 Ensure serialized lengths have correct endian format.

Reviewed-By: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman 8 yıl önce
ebeveyn
işleme
ce090d1be0
3 değiştirilmiş dosya ile 30 ekleme ve 30 silme
  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)