Add padding to gzipped backups

This commit is contained in:
Pete Walters 2024-04-19 13:02:37 -05:00 committed by GitHub
parent b58a7e0411
commit f2f29ec9dd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -40,6 +40,8 @@ public class GzipStreamTransform: StreamTransform, FinalizableStreamTransform {
public var hasPendingBytes: Bool { false }
public private(set) var hasFinalized = false
private var outputCount: Int = 0
private var stream: z_stream
private let operation: Operation
@ -173,6 +175,7 @@ public class GzipStreamTransform: StreamTransform, FinalizableStreamTransform {
bufferWritten = 0
stream.avail_out = UInt32(Constants.BufferSize)
outputCount += returnData.count
return returnData
}
@ -180,7 +183,22 @@ public class GzipStreamTransform: StreamTransform, FinalizableStreamTransform {
hasFinalized = true
// Finalize the gzip and return any remaining data
let finalData = try process(data: Data(), finalize: true)
var finalData = try process(data: Data(), finalize: true)
outputCount += finalData.count
switch operation {
case .compress:
// Pad the gzip similar to how attachments are padded.
// gzip will ignore this trailing data during decompression.
let unpaddedSize = UInt(bitPattern: outputCount)
let paddedSize = Cryptography.paddedSize(unpaddedSize: unpaddedSize)
if paddedSize > unpaddedSize {
finalData.append(Data(repeating: 0, count: Int(paddedSize - unpaddedSize)))
}
case .decompress:
break
}
// Close the zlib stream
var status = Z_OK
switch operation {