check / check (push) Waiting to run
Nothing goes in the 1.0 manifest that 1.0 does not read or write, and mfer never wrote either field. mf.proto now reserves the numbers 301 and 303 and both names in MFFilePath, and mf.pb.go is regenerated. The decoded-size check counts only file entries, hashes and timestamps, and counts a file entry, 16 bytes smaller without the two fields, at 160 bytes. export prints no ctime, and FileEntry loses the Ctime nothing set. FORMAT.md and the README no longer describe either field. The test of entries that decode too large gives each entry a second, empty hash: an entry with one hash and a modification time can no longer reach 8 times its size. Model: opus-5-5
43 lines
1.7 KiB
Go
43 lines
1.7 KiB
Go
package mfer
|
|
|
|
const (
|
|
// MaxDecompressedSize is the maximum allowed size of decompressed manifest
|
|
// data (256 MiB). This prevents decompression bombs from consuming excessive
|
|
// memory.
|
|
MaxDecompressedSize int64 = 256 * 1024 * 1024
|
|
|
|
// MaxManifestSize is the largest manifest file mfer reads (258 MiB).
|
|
// zstd's worst case grows data it cannot compress by 1/256, so an inner
|
|
// message of MaxDecompressedSize compresses to at most 257 MiB; the
|
|
// last MiB is room for the signature, the signing key and the other
|
|
// outer fields.
|
|
MaxManifestSize = MaxDecompressedSize + MaxDecompressedSize/256 + 1<<20
|
|
|
|
// zstdWindowSize is the zstd window zstd.SpeedBestCompression gives mfer's writer.
|
|
zstdWindowSize = 8 << 20
|
|
|
|
// uuidLength is the length in bytes of a binary UUID.
|
|
uuidLength = 16
|
|
|
|
// Numbers in mf.proto of MFFile.files and of the MFFilePath fields
|
|
// that decoding sets aside a fixed amount of memory for.
|
|
filesFieldNumber = 101
|
|
hashesFieldNumber = 3
|
|
mtimeFieldNumber = 302
|
|
|
|
// Bytes decoding sets aside for each file entry, hash and timestamp,
|
|
// however short its encoding. checkDecodedSize refuses an inner
|
|
// message for which these add up to more than maxDecodedGrowth times
|
|
// its size. The mode is held in the file entry itself.
|
|
decodedFileEntrySize = 160
|
|
decodedHashSize = 112
|
|
decodedTimestampSize = 64
|
|
|
|
// Each file entry mfer writes holds a path of at least one byte, a
|
|
// multihash at least as long as SHA-256's 34 bytes (AddFileWithHash
|
|
// refuses shorter ones) and a modification time: at least 47 bytes,
|
|
// counted at 336. So its manifests add up to at most about 7.15 times
|
|
// their size, and this limit is about 12% above that.
|
|
maxDecodedGrowth = 8
|
|
)
|