Test checksum types for invalid combinations (#20953)

This commit is contained in:
Klaus Post 2025-02-18 08:24:01 -08:00 committed by GitHub
parent b312f13473
commit aeabac9181
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 20 additions and 7 deletions

View File

@ -2254,6 +2254,8 @@ func toAPIErrorCode(ctx context.Context, err error) (apiErr APIErrorCode) {
apiErr = ErrServerNotInitialized
case errBucketMetadataNotInitialized:
apiErr = ErrBucketMetadataNotInitialized
case hash.ErrInvalidChecksum:
apiErr = ErrInvalidChecksum
}
// Compression errors

View File

@ -467,13 +467,10 @@ func completeMultipartOpts(ctx context.Context, r *http.Request, bucket, object
}
}
}
opts.WantChecksum, err = hash.GetContentChecksum(r.Header)
if err != nil {
return opts, InvalidArgument{
Bucket: bucket,
Object: object,
Err: fmt.Errorf("invalid/unknown checksum sent: %v", err),
}
return opts, err
}
opts.MTime = mtime
opts.UserDefined = make(map[string]string)

View File

@ -216,7 +216,7 @@ func (api objectAPIHandlers) NewMultipartUploadHandler(w http.ResponseWriter, r
checksumType := hash.NewChecksumHeader(r.Header)
if checksumType.Is(hash.ChecksumInvalid) {
writeErrorResponse(ctx, w, errorCodes.ToAPIErr(ErrInvalidRequestParameter), r.URL)
writeErrorResponse(ctx, w, errorCodes.ToAPIErr(ErrInvalidChecksum), r.URL)
return
} else if checksumType.IsSet() && !checksumType.Is(hash.ChecksumTrailing) {
opts.WantChecksum = &hash.Checksum{Type: checksumType}

View File

@ -148,8 +148,12 @@ func (c ChecksumType) IsSet() bool {
// NewChecksumType returns a checksum type based on the algorithm string and obj type.
func NewChecksumType(alg, objType string) ChecksumType {
full := ChecksumFullObject
if objType != xhttp.AmzChecksumTypeFullObject {
switch objType {
case xhttp.AmzChecksumTypeFullObject:
case xhttp.AmzChecksumTypeComposite, "":
full = 0
default:
return ChecksumInvalid
}
switch strings.ToUpper(alg) {
@ -567,6 +571,16 @@ func GetContentChecksum(h http.Header) (*Checksum, error) {
}
}
if res != nil {
switch h.Get(xhttp.AmzChecksumType) {
case xhttp.AmzChecksumTypeFullObject:
if !res.Type.CanMerge() {
return nil, ErrInvalidChecksum
}
res.Type |= ChecksumFullObject
case xhttp.AmzChecksumTypeComposite, "":
default:
return nil, ErrInvalidChecksum
}
return res, nil
}
}