[#210] Fix multipart object reader
All checks were successful
/ Vulncheck (pull_request) Successful in 2m38s
/ DCO (pull_request) Successful in 3m40s
/ Lint (pull_request) Successful in 5m20s
/ Tests (1.20) (pull_request) Successful in 3m19s
/ Tests (1.21) (pull_request) Successful in 3m8s
/ Builds (1.20) (pull_request) Successful in 6m1s
/ Builds (1.21) (pull_request) Successful in 1m33s

Signed-off-by: Marina Biryukova <m.biryukova@yadro.com>
This commit is contained in:
Marina Biryukova 2023-09-19 11:00:41 +03:00
parent 12cf29aed2
commit a4c612614a
2 changed files with 23 additions and 6 deletions

View file

@ -93,15 +93,22 @@ func newMultiObjectReader(ctx context.Context, cfg multiObjectReaderConfig) (*mu
} }
func findStartPart(cfg multiObjectReaderConfig) (index int, offset uint64) { func findStartPart(cfg multiObjectReaderConfig) (index int, offset uint64) {
return findPartByPosition(cfg.off, cfg.parts) position := cfg.off
for i, part := range cfg.parts {
// Strict inequality when searching for start position to avoid reading zero length part.
if position < part.Size {
return i, position
}
position -= part.Size
}
return -1, 0
} }
func findEndPart(cfg multiObjectReaderConfig) (index int, length uint64) { func findEndPart(cfg multiObjectReaderConfig) (index int, length uint64) {
return findPartByPosition(cfg.off+cfg.ln, cfg.parts) position := cfg.off + cfg.ln
} for i, part := range cfg.parts {
// Non-strict inequality when searching for end position to avoid out of payload range error.
func findPartByPosition(position uint64, parts []partObj) (index int, positionInPart uint64) {
for i, part := range parts {
if position <= part.Size { if position <= part.Size {
return i, position return i, position
} }

View file

@ -90,6 +90,16 @@ func TestMultiReader(t *testing.T) {
off: parts[0].Size - 4, off: parts[0].Size - 4,
ln: parts[1].Size + 8, ln: parts[1].Size + 8,
}, },
{
name: "second part",
off: parts[0].Size,
ln: parts[1].Size,
},
{
name: "second and third",
off: parts[0].Size,
ln: parts[1].Size + parts[2].Size,
},
{ {
name: "offset out of range", name: "offset out of range",
off: uint64(len(fullPayload) + 1), off: uint64(len(fullPayload) + 1),