Prototype secure ZIP extraction (T-102)
This commit is contained in:
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user