Browse Source

upgrade compressed chunk: fix treatment of ObfuscateSize chunks

the inner payload of ObfuscateSize chunks are compressed chunks and need
the same zlib fix and level patching as non-obfuscated compressed chunks.
Thomas Waldmann 3 years ago
parent
commit
c5540c2dd9
1 changed files with 16 additions and 7 deletions
  1. 16 7
      src/borg/archiver.py

+ 16 - 7
src/borg/archiver.py

@@ -380,13 +380,18 @@ class Archiver:
             return new_item
             return new_item
 
 
         def upgrade_compressed_chunk(chunk):
         def upgrade_compressed_chunk(chunk):
+            def upgrade_zlib_and_level(chunk):
+                if ZLIB_legacy.detect(chunk):
+                    ctype = ZLIB.ID
+                    chunk = ctype + level + chunk  # get rid of the attic legacy: prepend separate type/level bytes
+                else:
+                    ctype = chunk[0:1]
+                    chunk = ctype + level + chunk[2:]  # keep type same, but set level
+                return chunk
+
+            ctype = chunk[0:1]
             level = b'\xFF'  # FF means unknown compression level
             level = b'\xFF'  # FF means unknown compression level
-            if ZLIB_legacy.detect(chunk):
-                ctype = ZLIB.ID
-                chunk = ctype + level + chunk  # get rid of the attic legacy: prepend separate type/level bytes
-            else:
-                ctype = chunk[0:1]
-                chunk = ctype + level + chunk[2:]  # keep type same, but set level
+
             if ctype == ObfuscateSize.ID:
             if ctype == ObfuscateSize.ID:
                 # in older borg, we used unusual byte order
                 # in older borg, we used unusual byte order
                 old_header_fmt = Struct('>I')
                 old_header_fmt = Struct('>I')
@@ -395,7 +400,11 @@ class Archiver:
                 size_bytes = chunk[2:2+length]
                 size_bytes = chunk[2:2+length]
                 size = old_header_fmt.unpack(size_bytes)
                 size = old_header_fmt.unpack(size_bytes)
                 size_bytes = new_header_fmt.pack(size)
                 size_bytes = new_header_fmt.pack(size)
-                chunk = chunk[0:2] + size_bytes + chunk[2+length:]
+                compressed = chunk[2+length:]
+                compressed = upgrade_zlib_and_level(compressed)
+                chunk = ctype + level + size_bytes + compressed
+            else:
+                chunk = upgrade_zlib_and_level(chunk)
             return chunk
             return chunk
 
 
         dry_run = args.dry_run
         dry_run = args.dry_run