Prototype secure ZIP extraction (T-102)

This commit is contained in:
ila
2026-07-16 16:22:45 +08:00
parent 0d6ed05d7e
commit 0ffeff63e1
8 changed files with 890 additions and 9 deletions
+45
View File
@@ -0,0 +1,45 @@
package installer
import (
"errors"
"fmt"
"math"
)
var ErrInvalidLimits = errors.New("invalid ZIP extraction limits")
const (
DefaultMaxEntries = 10_000
DefaultMaxUncompressedBytes = int64(4 * 1024 * 1024 * 1024)
DefaultMaxCompressionRatio = 200.0
)
// Limits bounds archive metadata and decompressed output.
type Limits struct {
MaxEntries int
MaxUncompressedBytes int64
MaxCompressionRatio float64
}
func DefaultLimits() Limits {
return Limits{
MaxEntries: DefaultMaxEntries,
MaxUncompressedBytes: DefaultMaxUncompressedBytes,
MaxCompressionRatio: DefaultMaxCompressionRatio,
}
}
func (limits Limits) validate() error {
if limits.MaxEntries <= 0 {
return fmt.Errorf("%w: MaxEntries must be positive", ErrInvalidLimits)
}
if limits.MaxUncompressedBytes <= 0 {
return fmt.Errorf("%w: MaxUncompressedBytes must be positive", ErrInvalidLimits)
}
if limits.MaxCompressionRatio <= 0 ||
math.IsNaN(limits.MaxCompressionRatio) ||
math.IsInf(limits.MaxCompressionRatio, 0) {
return fmt.Errorf("%w: MaxCompressionRatio must be finite and positive", ErrInvalidLimits)
}
return nil
}