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 }