46 lines
1.1 KiB
Go
46 lines
1.1 KiB
Go
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
|
|
}
|