From 586466584fbf14ce9c95cc15cadeb3cc426aeab4 Mon Sep 17 00:00:00 2001 From: Andreas Auernhammer Date: Mon, 22 Oct 2018 23:23:23 +0200 Subject: [PATCH] fix wrong actual part size assignment in CopyObjectPart (#6652) This commit fixes a wrong assignment to `actualPartSize`. The `actualPartSize` for an encrypted src object is not `srcInfo.Size` because that's the encrypted object size which is larger than the actual object size. So the actual part size for an encrypted object is the decrypted size of `srcInfo.Size`. --- cmd/object-handlers.go | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/cmd/object-handlers.go b/cmd/object-handlers.go index 71cf80faf..9d90615df 100644 --- a/cmd/object-handlers.go +++ b/cmd/object-handlers.go @@ -1448,11 +1448,17 @@ func (api objectAPIHandlers) CopyObjectPartHandler(w http.ResponseWriter, r *htt defer gr.Close() srcInfo := gr.ObjInfo - var actualPartSize int64 - actualPartSize = srcInfo.Size + actualPartSize := srcInfo.Size + if crypto.IsEncrypted(srcInfo.UserDefined) { + actualPartSize, err = srcInfo.DecryptedSize() + if err != nil { + writeErrorResponse(w, toAPIErrorCode(err), r.URL) + return + } + } // Special care for CopyObjectPart - if partRangeErr := checkCopyPartRangeWithSize(rs, srcInfo.Size); partRangeErr != nil { + if partRangeErr := checkCopyPartRangeWithSize(rs, actualPartSize); partRangeErr != nil { writeCopyPartErr(w, partRangeErr, r.URL) return } @@ -1463,23 +1469,11 @@ func (api objectAPIHandlers) CopyObjectPartHandler(w http.ResponseWriter, r *htt } // Get the object offset & length - startOffset, length, _ := rs.GetOffsetLength(srcInfo.Size) - + startOffset, length, _ := rs.GetOffsetLength(actualPartSize) if rangeHeader != "" { actualPartSize = length } - if objectAPI.IsEncryptionSupported() { - if crypto.IsEncrypted(srcInfo.UserDefined) { - decryptedSize, decryptErr := srcInfo.DecryptedSize() - if decryptErr != nil { - writeErrorResponse(w, toAPIErrorCode(err), r.URL) - return - } - startOffset, length, _ = rs.GetOffsetLength(decryptedSize) - } - } - /// maximum copy size for multipart objects in a single operation if isMaxAllowedPartSize(length) { writeErrorResponse(w, ErrEntityTooLarge, r.URL)