fix: reject an empty start-after and continuation-token in ListObjects (V1)

This commit is contained in:
dualfroz committed 2026-10-12 14:30:16 +02:00
1 parent 613c71290f
commit 276128b42b
4 files changed
+83 -16

No files matched your search

+31 -14
View File
@@ -195,9 +195,9 @@ func ListObjects_invalid_max_keys(s *S3Conf) error {
})
}
// start-after belongs to ListObjectsV2, so S3 rejects it on a V1 listing
// instead of ignoring it. The SDK ListObjects input has no StartAfter field,
// so the request is signed and sent by hand.
// start-after and continuation-token belong to ListObjectsV2, so S3 rejects
// either one on a V1 listing, with or without a value. The SDK ListObjects
// input has neither field, so the requests are signed and sent by hand.
func ListObjects_start_after(s *S3Conf) error {
testName := "ListObjects_start_after"
return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error {
@@ -206,19 +206,36 @@ func ListObjects_start_after(s *S3Conf) error {
return err
}
req, err := createSignedReq(http.MethodGet, s.endpoint,
fmt.Sprintf("%v?start-after=bar", bucket),
s.awsID, s.awsSecret, "s3", s.awsRegion, "", nil, time.Now(), nil)
if err != nil {
return err
startAfterErr := s3err.GetInvalidArgumentErr(s3err.InvalidArgStartAfter, "")
contTokenErr := s3err.GetInvalidArgumentErr(s3err.InvalidArgContinuationToken, "")
for _, test := range []struct {
query string
expected s3err.S3Error
}{
{"start-after=bar", startAfterErr},
{"start-after=", startAfterErr},
{"start-after", startAfterErr},
{"continuation-token=bar", contTokenErr},
{"continuation-token=", contTokenErr},
} {
req, err := createSignedReq(http.MethodGet, s.endpoint,
fmt.Sprintf("%v?%v", bucket, test.query),
s.awsID, s.awsSecret, "s3", s.awsRegion, "", nil, time.Now(), nil)
if err != nil {
return err
}
resp, err := s.httpClient.Do(req)
if err != nil {
return err
}
if err := checkHTTPResponseApiErr(resp, test.expected); err != nil {
return fmt.Errorf("%v: %w", test.query, err)
}
}
resp, err := s.httpClient.Do(req)
if err != nil {
return err
}
return checkHTTPResponseApiErr(resp, s3err.GetInvalidArgumentErr(s3err.InvalidArgStartAfter, ""))
return nil
})
}