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.
This commit is contained in:
Thomas Waldmann 2022-05-18 14:47:47 +02:00
parent 72c68c49d0
commit c5540c2dd9
1 changed files with 16 additions and 7 deletions

View File

@ -380,13 +380,18 @@ class Archiver:
return new_item
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
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:
# in older borg, we used unusual byte order
old_header_fmt = Struct('>I')
@ -395,7 +400,11 @@ class Archiver:
size_bytes = chunk[2:2+length]
size = old_header_fmt.unpack(size_bytes)
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
dry_run = args.dry_run