mirror of
https://github.com/versity/versitygw.git
synced 2026-08-28 20:06:02 +00:00
fix: enforce 5gb copy source object size threshold.
Fixes #1896 Enforces the S3 `5 GiB` copy source size limit across the posix and azure backends for `CopyObject` and `UploadPartCopy`, returning `InvalidRequest` when the source object exceeds the threshold. The limit is now configurable via `--copy-object-threshold` (`VGW_COPY_OBJECT_THRESHOLD`, default 5 GiB). A new `--mp-max-parts flag` (`VGW_MP_MAX_PARTS`, default `10000`) has been added to make multipart upload parts number limit configurable. No integration test has been added, as GitHub Actions cannot reliably handle large objects.
This commit is contained in:
@@ -681,7 +681,7 @@ func TestAdminController_CreateBucket(t *testing.T) {
|
||||
},
|
||||
}
|
||||
|
||||
s3api := New(be, iam, nil, nil, nil, false, false, "")
|
||||
s3api := New(be, iam, nil, nil, nil, false, false, "", 10000)
|
||||
|
||||
ctrl := AdminController{
|
||||
iam: iam,
|
||||
|
||||
@@ -38,6 +38,7 @@ type S3ApiController struct {
|
||||
logger s3log.AuditLogger
|
||||
evSender s3event.S3EventSender
|
||||
mm metrics.Manager
|
||||
mpMaxParts int
|
||||
readonly bool
|
||||
disableACL bool
|
||||
virtualDomain string
|
||||
@@ -60,7 +61,7 @@ var (
|
||||
xmlhdr = []byte(`<?xml version="1.0" encoding="UTF-8"?>` + "\n")
|
||||
)
|
||||
|
||||
func New(be backend.Backend, iam auth.IAMService, logger s3log.AuditLogger, evs s3event.S3EventSender, mm metrics.Manager, readonly, disableACL bool, virtualDomain string) S3ApiController {
|
||||
func New(be backend.Backend, iam auth.IAMService, logger s3log.AuditLogger, evs s3event.S3EventSender, mm metrics.Manager, readonly, disableACL bool, virtualDomain string, mpMaxParts int) S3ApiController {
|
||||
return S3ApiController{
|
||||
be: be,
|
||||
iam: iam,
|
||||
@@ -70,6 +71,7 @@ func New(be backend.Backend, iam auth.IAMService, logger s3log.AuditLogger, evs
|
||||
mm: mm,
|
||||
disableACL: disableACL,
|
||||
virtualDomain: virtualDomain,
|
||||
mpMaxParts: mpMaxParts,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -282,7 +282,7 @@ func (c S3ApiController) UploadPart(ctx *fiber.Ctx) (*Response, error) {
|
||||
}, err
|
||||
}
|
||||
|
||||
if partNumber < minPartNumber || partNumber > maxPartNumber {
|
||||
if partNumber < minPartNumber || partNumber > int32(c.mpMaxParts) {
|
||||
debuglogger.Logf("invalid part number: %d", partNumber)
|
||||
return &Response{
|
||||
MetaOpts: &MetaOptions{
|
||||
|
||||
@@ -607,7 +607,8 @@ func TestS3ApiController_UploadPart(t *testing.T) {
|
||||
}
|
||||
|
||||
ctrl := S3ApiController{
|
||||
be: be,
|
||||
be: be,
|
||||
mpMaxParts: 10000,
|
||||
}
|
||||
|
||||
testController(
|
||||
|
||||
+2
-1
@@ -42,10 +42,11 @@ type S3ApiRouter struct {
|
||||
region string
|
||||
virtualDomain string
|
||||
corsAllowOrigin string
|
||||
mpMaxParts int
|
||||
}
|
||||
|
||||
func (sa *S3ApiRouter) Init() {
|
||||
ctrl := controllers.New(sa.be, sa.iam, sa.logger, sa.evs, sa.mm, sa.readonly, sa.disableACL, sa.virtualDomain)
|
||||
ctrl := controllers.New(sa.be, sa.iam, sa.logger, sa.evs, sa.mm, sa.readonly, sa.disableACL, sa.virtualDomain, sa.mpMaxParts)
|
||||
sa.Ctrl = ctrl
|
||||
adminServices := &controllers.Services{
|
||||
Logger: sa.aLogger,
|
||||
|
||||
@@ -175,6 +175,11 @@ func WithReadOnly() Option {
|
||||
return func(s *S3ApiServer) { s.Router.readonly = true }
|
||||
}
|
||||
|
||||
// WithMpMaxParts sets the maximum number of parts allowed in a multipart upload.
|
||||
func WithMpMaxParts(n int) Option {
|
||||
return func(s *S3ApiServer) { s.Router.mpMaxParts = n }
|
||||
}
|
||||
|
||||
// WithHostStyle enabled host-style bucket addressing on the server
|
||||
func WithHostStyle(virtualDomain string) Option {
|
||||
return func(s *S3ApiServer) {
|
||||
|
||||
Reference in New Issue
Block a user