diff --git a/go.mod b/go.mod index bd7c39b2..0e3398c9 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/aws/aws-sdk-go-v2 v1.47.1 github.com/aws/aws-sdk-go-v2/config v1.33.6 github.com/aws/aws-sdk-go-v2/credentials v1.20.6 - github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager v0.4.10 + github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager v0.4.11 github.com/aws/aws-sdk-go-v2/service/s3 v1.113.4 github.com/aws/smithy-go v1.28.2 github.com/cbergoon/merkletree v0.5.0 diff --git a/go.sum b/go.sum index 5d774813..0d38903e 100644 --- a/go.sum +++ b/go.sum @@ -58,6 +58,8 @@ github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager v0.4.7 h1:Z9bKpfqkszHyVq github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager v0.4.7/go.mod h1:DGmRQxLBAxXHcf4Wty/aJKUH6k8mgItJIaNrNObcWpg= github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager v0.4.10 h1:DaCvPvqeZCMqziWeKPiLCv/tUvpe4/Cq79bjE1ZGtHY= github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager v0.4.10/go.mod h1:eHZtvcgtQ2WQDWcIs/VUuM3zglCEGipTaxfaTmzZxpw= +github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager v0.4.11 h1:u0Ee5K3dl/T3atM4SudF9RKwpjOBbcrypL+EnPzh+7Y= +github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager v0.4.11/go.mod h1:eHZtvcgtQ2WQDWcIs/VUuM3zglCEGipTaxfaTmzZxpw= github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.3 h1:Hp/VgjP0BysR3OgLlR057Vz2LcbbVnoWeJ+3qWiS/fY= github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.3/go.mod h1:nwGV5qw7F1IZPgxCvA/ph8N2TAuz+BkRG/bXn808qMA= github.com/aws/aws-sdk-go-v2/internal/configsources v1.5.4 h1:CLq4+8UHCI+ZZYl/EuJxXovaIVN2xeeT8JV+dsApQ5E= diff --git a/vendor/github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager/CHANGELOG.md index bac5a80d..e89d437b 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager/CHANGELOG.md @@ -1,3 +1,7 @@ +# v0.4.11 (2026-09-28) + +* **Bug Fix**: Add reassembly check for GetObject parts mode so mismatch between response part range and calculated position will throw error + # v0.4.10 (2026-09-24) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager/api_op_DownloadObject.go b/vendor/github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager/api_op_DownloadObject.go index 46788899..f0430186 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager/api_op_DownloadObject.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager/api_op_DownloadObject.go @@ -909,11 +909,11 @@ func getRespRange(rng string) (int64, int64, error) { ranges := strings.Split(strings.Split(strings.Split(rng, " ")[1], "/")[0], "-") start, err := strconv.ParseInt(ranges[0], 10, 64) if err != nil { - return 0, 0, fmt.Errorf("error when parsing response start: %v", err) + return -1, -1, fmt.Errorf("error when parsing response start: %v", err) } end, err := strconv.ParseInt(ranges[1], 10, 64) if err != nil { - return 0, 0, fmt.Errorf("error when parsing response end: %v", err) + return -1, -1, fmt.Errorf("error when parsing response end: %v", err) } return start, end, nil } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager/concurrent_reader.go b/vendor/github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager/concurrent_reader.go index 1f8c1404..83157970 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager/concurrent_reader.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager/concurrent_reader.go @@ -99,9 +99,9 @@ func (r *concurrentReader) Read(p []byte) (int, error) { ch <- getChunk{part: r.index + 1, index: r.index} } else { ch <- getChunk{withRange: r.byteRange(), index: r.index} + r.pos += r.partSize } - r.pos += r.partSize r.index++ } @@ -154,28 +154,32 @@ func (r *concurrentReader) downloadChunk(ctx context.Context, chunk getChunk, cl return nil, err } - if params.Range != nil && out.ContentRange != nil { - reqStart, reqEnd, err := getReqRange(aws.ToString(params.Range)) + respStart := int64(-1) + respEnd := int64(-1) + if out.ContentRange != nil { + respStart, respEnd, err = getRespRange(aws.ToString(out.ContentRange)) if err != nil { return nil, err } - respStart, respEnd, err := getRespRange(aws.ToString(out.ContentRange)) - if err != nil { - return nil, err - } - // don't validate first chunk since object size is unknown when getting that - if reqStart != 0 && (reqStart != respStart || reqEnd != respEnd) { - return nil, fmt.Errorf("range mismatch between request %d-%d and response %d-%d", reqStart, reqEnd, respStart, respEnd) + if params.Range != nil { + reqStart, reqEnd, err := getReqRange(aws.ToString(params.Range)) + if err != nil { + return nil, err + } + // don't validate first chunk since object size is unknown when getting that + if reqStart != 0 && (reqStart != respStart || reqEnd != respEnd) { + return nil, fmt.Errorf("range mismatch between request %d-%d and response %d-%d", reqStart, reqEnd, respStart, respEnd) + } } } defer out.Body.Close() buf, err := io.ReadAll(out.Body) - if err != nil { return nil, err } - r.ch <- outChunk{body: bytes.NewReader(buf), index: chunk.index, length: aws.ToInt64(out.ContentLength)} + + r.ch <- outChunk{body: bytes.NewReader(buf), index: chunk.index, length: aws.ToInt64(out.ContentLength), rangeStart: respStart, rangeEnd: respEnd} output := &GetObjectOutput{} output.mapFromGetObjectOutput(out, params.ChecksumMode) @@ -199,8 +203,10 @@ type outChunk struct { body io.Reader index int32 - length int64 - cur int64 + rangeStart int64 + rangeEnd int64 + length int64 + cur int64 } func (r *concurrentReader) read(p []byte) (int, error) { @@ -226,7 +232,7 @@ func (r *concurrentReader) partRead(p []byte) (int, error) { if written >= cap(p) { // don't return yet, parts already dispatched up to capacity may - // still be downloading or sitting in r.ch, and the receive loop + // still be downloading or sitting in r.ch, and the received loop // below is what drains them break } @@ -238,6 +244,20 @@ func (r *concurrentReader) partRead(p []byte) (int, error) { break } + //if e, a := r.pos-r.offset-r.written, written; e != a { + if c.rangeStart >= 0 { + if es, as := int64(written), c.rangeStart+c.cur-r.written; es != as { + r.setErr(fmt.Errorf("range mismatch between computed start position %d and actual start position %d for part %d in p", es, as, c.index+1)) + r.clean() + return 0, r.getErr() + } + if ee, ae := int64(written)+c.length-c.cur, c.rangeEnd-r.written+1; ee != ae { + r.setErr(fmt.Errorf("range mismatch between computed end position %d and actual end position %d for part %d in p", ee, ae, c.index+1)) + r.clean() + return 0, r.getErr() + } + } + n, err := c.body.Read(p[written:]) c.cur += int64(n) written += n @@ -273,6 +293,18 @@ func (r *concurrentReader) partRead(p []byte) (int, error) { // only directly feed into p if this is the next neighbor part if oc.index == r.consecutiveIndex && written < cap(p) { + if oc.rangeStart >= 0 { + if es, as := int64(written), oc.rangeStart-r.written; es != as { + r.setErr(fmt.Errorf("range mismatch between computed start position %d and actual start position %d for part %d in p", es, as, oc.index+1)) + r.clean() + return 0, r.getErr() + } + if ee, ae := int64(written)+oc.length, oc.rangeEnd-r.written+1; ee != ae { + r.setErr(fmt.Errorf("range mismatch between computed end position %d and actual end position %d for part %d in p", ee, ae, oc.index+1)) + r.clean() + return 0, r.getErr() + } + } n, err := oc.body.Read(p[written:]) oc.cur += int64(n) written += n @@ -420,7 +452,9 @@ func (r *concurrentReader) setErr(err error) { r.m.Lock() defer r.m.Unlock() - r.err = err + if r.err == nil { + r.err = err + } } func (r *concurrentReader) getErr() error { diff --git a/vendor/github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager/go_module_metadata.go index fe2665cb..7fcb4b52 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager/go_module_metadata.go @@ -3,4 +3,4 @@ package transfermanager // goModuleVersion is the tagged release for this module -const goModuleVersion = "0.4.10" +const goModuleVersion = "0.4.11" diff --git a/vendor/modules.txt b/vendor/modules.txt index 99448527..e9fbbbe1 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -117,7 +117,7 @@ github.com/aws/aws-sdk-go-v2/feature/ec2/imds github.com/aws/aws-sdk-go-v2/feature/ec2/imds/internal/config # github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.22.17 ## explicit; go 1.24 -# github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager v0.4.10 +# github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager v0.4.11 ## explicit; go 1.24 github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager/types