mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2026-09-20 13:30:46 +02:00
fix(s3api): reject lifecycle rules whose TTL overflows int32 seconds
bucketLifecycleTTLRule.TtlSec is int32. AWS allows Expiration.Days up to 2,147,483,647 which would silently overflow when multiplied by LifeCycleInterval. Compute in int64, return InvalidRequest above math.MaxInt32 seconds.
This commit is contained in:
@@ -880,7 +880,16 @@ func (s3a *S3ApiServer) PutBucketLifecycleConfigurationHandler(w http.ResponseWr
|
||||
if rule.Expiration.Days == 0 {
|
||||
continue
|
||||
}
|
||||
ttlSec := int32((time.Duration(rule.Expiration.Days) * util.LifeCycleInterval).Seconds())
|
||||
// Compute in int64 first, then refuse rules whose TTL won't fit
|
||||
// int32 seconds. AWS allows Days up to 2,147,483,647, which would
|
||||
// silently overflow if we cast directly.
|
||||
ttlSecondsInt64 := int64(rule.Expiration.Days) * int64(util.LifeCycleInterval/time.Second)
|
||||
if ttlSecondsInt64 > math.MaxInt32 {
|
||||
glog.Errorf("PutBucketLifecycleConfigurationHandler %s: Expiration.Days=%d exceeds int32-second TTL", bucket, rule.Expiration.Days)
|
||||
s3err.WriteErrorResponse(w, r, s3err.ErrInvalidRequest)
|
||||
return
|
||||
}
|
||||
ttlSec := int32(ttlSecondsInt64)
|
||||
lifecycleRules = append(lifecycleRules, bucketLifecycleTTLRule{
|
||||
Prefix: rulePrefix,
|
||||
TtlSec: ttlSec,
|
||||
|
||||
Reference in New Issue
Block a user