Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

service/s3/s3manager: Fix index out of range when a io.Reader returns -1 #378

Merged
merged 5 commits into from
Oct 1, 2019
Merged

service/s3/s3manager: Fix index out of range when a io.Reader returns -1 #378

merged 5 commits into from
Oct 1, 2019

Conversation

dgrr
Copy link
Contributor

@dgrr dgrr commented Sep 1, 2019

Fixes the S3 Upload Manager's handling of an unbounded streaming reader that returns negative bytes read.

Copy link
Contributor

@jasdel jasdel left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for creating this PR @dgrr. I understand to protect against a negative Read, though it would be helpful to have more background on the situtation where this error could occur. Would you be able to provide more details on how this error occurred, and the background on the usecase?

@jasdel jasdel added the response-requested Waiting on additional info and feedback. Will move to "closing-soon" in 7 days. label Sep 10, 2019
@dgrr
Copy link
Contributor Author

dgrr commented Sep 11, 2019

Hello @jasdel

My error is happening because I am using a custom reader I made myself to read the files from S3 and process the file in between. When my custom reader detects an error returns -1 and the error. I can change that to return 0 and an error, but I think it's not the expected behavior in an io.Reader when an error happens.

@jasdel
Copy link
Contributor

jasdel commented Sep 11, 2019

Thanks for the update @dgrr. In the case of an error returned by a Read call the n parameter "should" be ignored by the caller. With that said, it looks like the nextReader function's usage of the Read's returned n should be updated to only return the error and not create the buffer if there was an error.

We probably don't want to check for a value of n, but should update the code to return an err if there was an error, and otherwise return the sized buffer.

n, err := readFillBuf(r, part)
if err != nil {
    return nil, n, err
}

u.readerPos += int64(n)

return bytes.NewReader(part[0:n]), n, nil

There is no recovery when the Read method returns an error, so don't need to worry about updating u.readerPos in the case of an error.

Copy link
Contributor

@jasdel jasdel left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggest updating nextReader to check for error and return that error and n, and only creating the bytes.NewReader if there was no error.

@jasdel jasdel added pr/needs-review This PR needs a review from a Member. and removed response-requested Waiting on additional info and feedback. Will move to "closing-soon" in 7 days. labels Sep 11, 2019
@dgrr
Copy link
Contributor Author

dgrr commented Sep 30, 2019

What's next? @jasdel

@jasdel jasdel changed the title Fixed index out of range when a io.Reader returns -1 in uploader.nextReader() service/s3/s3manager: Fix index out of range when a io.Reader returns -1 Sep 30, 2019
Copy link
Contributor

@jasdel jasdel left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for making these updates @dgrr. Added comment for error handling in case err is nil.

Also it would be helpful to also add a CHANGELOG_PENDING.md entry for this bug fix.

diff --git a/CHANGELOG_PENDING.md b/CHANGELOG_PENDING.md
index b1181f868..0e509847a 100644
--- a/CHANGELOG_PENDING.md
+++ b/CHANGELOG_PENDING.md
@@ -12,4 +12,5 @@
 * `aws`: Fixes bug in calculating throttled retry delay ([#373](https://github.com/aws/aws-sdk-go/pull/373))
   * The `Retry-After` duration specified in the request is now added to the Retry delay for throttled exception. Adds test for retry delays for throttled exceptions. Fixes bug where the throttled retry's math was off.
   * Fixes [#45](https://github.com/aws/aws-sdk-go/issues/45)
-
+* `service/s3/s3manager`: Fix index out of range when a streaming reader returns -1 ([#378](https://github.com/aws/aws-sdk-go-v2/pull/378))
+  * Fixes the S3 Upload Manager's handling of an unbounded streaming reader that returns negative bytes read.

service/s3/s3manager/upload.go Show resolved Hide resolved
@jasdel jasdel removed the pr/needs-review This PR needs a review from a Member. label Sep 30, 2019
@dgrr
Copy link
Contributor Author

dgrr commented Oct 1, 2019

@jasdel updated. I also resolved the conflicts in CHANGELOG_PENDING.md

@jasdel
Copy link
Contributor

jasdel commented Oct 1, 2019

Thanks for making those updates. The change looks good, we'll get this merged in.

@jasdel jasdel merged commit 60a96ac into aws:master Oct 1, 2019
skmcgrail added a commit to skmcgrail/aws-sdk-go-v2 that referenced this pull request Oct 1, 2019
* Synced the V2 SDK with latest AWS service API definitions.

* This update includes breaking changes to how the DynamoDB AttributeValue (un)marshier handles empty collections.

* `service/s3/s3crypto`: Deprecates the crypto client from the SDK ([aws#394](aws#394))
  * s3crypto client is now deprecated and may be removed from the future versions of the SDK.
* `aws`: Removes plugin credential provider ([aws#391](aws#391))
  * Removing plugin credential provider from the v2 SDK developer preview. This feature may be made available as a separate module.
* Removes support for deprecated Go versions ([aws#393](aws#393))
  * Removes support for Go version specific files from the SDK. Also removes irrelevant build tags, and updates the README.md file.
  * Raises the minimum supported version to Go 1.11 for the SDK. Older versions may work, but are not actively supported

* `service/s3/s3manager`: Add Upload Buffer Provider ([aws#404](aws#404))
  * Adds a new `BufferProvider` member for specifying how part data can be buffered in memory.
  * Windows platforms will now default to buffering 1MB per part to reduce contention when uploading files.
  * Non-Windows platforms will continue to employ a non-buffering behavior.
* `service/s3/s3manager`: Add Download Buffer Provider ([aws#404](aws#404))
  * Adds a new `BufferProvider` member for specifying how part data can be buffered in memory when copying from the http response body.
  * Windows platforms will now default to buffering 1MB per part to reduce contention when downloading files.
  * Non-Windows platforms will continue to employ a non-buffering behavior.
* `service/dynamodb/dynamodbattribute`: New Encoder and Decoder Behavior for Empty Collections ([aws#401](aws#401))
  * The `Encoder` and `Decoder` types have been enhanced to support the marshaling of empty structures, maps, and slices to and from their respective DynamoDB AttributeValues.
  * This change incorporates the behavior changes introduced via a marshal option in V1 ([aws#2834](aws/aws-sdk-go#2834))

* `internal/awsutil`: Add suppressing logging sensitive API parameters ([aws#398](aws#398))
  * Adds suppressing logging sensitive API parameters marked with the `sensitive` trait. This prevents the API type's `String` method returning a string representation of the API type with sensitive fields printed such as keys and passwords.
  * Related to [aws/aws-sdk-go#2310](aws/aws-sdk-go#2310)
  * Fixes [aws#251](aws#251)
* `aws/request` : Retryer is now a named field on Request. ([aws#393](aws#393))
* `service/s3/s3manager`: Adds `sync.Pool` to allow reuse of part buffers for streaming payloads ([aws#404](aws#404))
  * Fixes [aws#402](aws#402)
  * Uses the new behavior introduced in V1 [aws#2863](aws/aws-sdk-go#2863) which allows the reuse of the sync.Pool across multiple Upload request that match part sizes.

* `service/s3/s3manager`: Fix index out of range when a streaming reader returns -1 ([aws#378](aws#378))
  * Fixes the S3 Upload Manager's handling of an unbounded streaming reader that returns negative bytes read.
* `internal/ini`: Fix ini parser to handle empty values [aws#406](aws#406)
  * Fixes incorrect modifications to the previous token value of the skipper. Adds checks for cases where a skipped statement should be marked as complete and not be ignored.
  * Adds tests for nested and empty field value parsing, along with tests suggested in [aws/aws-sdk-go#2801](aws/aws-sdk-go#2801)
skmcgrail added a commit to skmcgrail/aws-sdk-go-v2 that referenced this pull request Oct 1, 2019
### Services
* Synced the V2 SDK with latest AWS service API definitions.

### SDK Breaking changes
* This update includes breaking changes to how the DynamoDB AttributeValue (un)marshier handles empty collections.

### Deprecations
* `service/s3/s3crypto`: Deprecates the crypto client from the SDK ([aws#394](aws#394))
  * s3crypto client is now deprecated and may be removed from the future versions of the SDK.
* `aws`: Removes plugin credential provider ([aws#391](aws#391))
  * Removing plugin credential provider from the v2 SDK developer preview. This feature may be made available as a separate module.
* Removes support for deprecated Go versions ([aws#393](aws#393))
  * Removes support for Go version specific files from the SDK. Also removes irrelevant build tags, and updates the README.md file.
  * Raises the minimum supported version to Go 1.11 for the SDK. Older versions may work, but are not actively supported

### SDK Features
* `service/s3/s3manager`: Add Upload Buffer Provider ([aws#404](aws#404))
  * Adds a new `BufferProvider` member for specifying how part data can be buffered in memory.
  * Windows platforms will now default to buffering 1MB per part to reduce contention when uploading files.
  * Non-Windows platforms will continue to employ a non-buffering behavior.
* `service/s3/s3manager`: Add Download Buffer Provider ([aws#404](aws#404))
  * Adds a new `BufferProvider` member for specifying how part data can be buffered in memory when copying from the http response body.
  * Windows platforms will now default to buffering 1MB per part to reduce contention when downloading files.
  * Non-Windows platforms will continue to employ a non-buffering behavior.
* `service/dynamodb/dynamodbattribute`: New Encoder and Decoder Behavior for Empty Collections ([aws#401](aws#401))
  * The `Encoder` and `Decoder` types have been enhanced to support the marshaling of empty structures, maps, and slices to and from their respective DynamoDB AttributeValues.
  * This change incorporates the behavior changes introduced via a marshal option in V1 ([aws#2834](aws/aws-sdk-go#2834))

### SDK Enhancements
* `internal/awsutil`: Add suppressing logging sensitive API parameters ([aws#398](aws#398))
  * Adds suppressing logging sensitive API parameters marked with the `sensitive` trait. This prevents the API type's `String` method returning a string representation of the API type with sensitive fields printed such as keys and passwords.
  * Related to [aws/aws-sdk-go#2310](aws/aws-sdk-go#2310)
  * Fixes [aws#251](aws#251)
* `aws/request` : Retryer is now a named field on Request. ([aws#393](aws#393))
* `service/s3/s3manager`: Adds `sync.Pool` to allow reuse of part buffers for streaming payloads ([aws#404](aws#404))
  * Fixes [aws#402](aws#402)
  * Uses the new behavior introduced in V1 [aws#2863](aws/aws-sdk-go#2863) which allows the reuse of the sync.Pool across multiple Upload request that match part sizes.

### SDK Bugs
* `service/s3/s3manager`: Fix index out of range when a streaming reader returns -1 ([aws#378](aws#378))
  * Fixes the S3 Upload Manager's handling of an unbounded streaming reader that returns negative bytes read.
* `internal/ini`: Fix ini parser to handle empty values [aws#406](aws#406)
  * Fixes incorrect modifications to the previous token value of the skipper. Adds checks for cases where a skipped statement should be marked as complete and not be ignored.
  * Adds tests for nested and empty field value parsing, along with tests suggested in [aws/aws-sdk-go#2801](aws/aws-sdk-go#2801)
skmcgrail added a commit that referenced this pull request Oct 2, 2019
### Services
* Synced the V2 SDK with latest AWS service API definitions.

### SDK Breaking changes
* This update includes breaking changes to how the DynamoDB AttributeValue (un)marshier handles empty collections.

### Deprecations
* `service/s3/s3crypto`: Deprecates the crypto client from the SDK ([#394](#394))
  * s3crypto client is now deprecated and may be removed from the future versions of the SDK.
* `aws`: Removes plugin credential provider ([#391](#391))
  * Removing plugin credential provider from the v2 SDK developer preview. This feature may be made available as a separate module.
* Removes support for deprecated Go versions ([#393](#393))
  * Removes support for Go version specific files from the SDK. Also removes irrelevant build tags, and updates the README.md file.
  * Raises the minimum supported version to Go 1.11 for the SDK. Older versions may work, but are not actively supported

### SDK Features
* `service/s3/s3manager`: Add Upload Buffer Provider ([#404](#404))
  * Adds a new `BufferProvider` member for specifying how part data can be buffered in memory.
  * Windows platforms will now default to buffering 1MB per part to reduce contention when uploading files.
  * Non-Windows platforms will continue to employ a non-buffering behavior.
* `service/s3/s3manager`: Add Download Buffer Provider ([#404](#404))
  * Adds a new `BufferProvider` member for specifying how part data can be buffered in memory when copying from the http response body.
  * Windows platforms will now default to buffering 1MB per part to reduce contention when downloading files.
  * Non-Windows platforms will continue to employ a non-buffering behavior.
* `service/dynamodb/dynamodbattribute`: New Encoder and Decoder Behavior for Empty Collections ([#401](#401))
  * The `Encoder` and `Decoder` types have been enhanced to support the marshaling of empty structures, maps, and slices to and from their respective DynamoDB AttributeValues.
  * This change incorporates the behavior changes introduced via a marshal option in V1 ([#2834](aws/aws-sdk-go#2834))

### SDK Enhancements
* `internal/awsutil`: Add suppressing logging sensitive API parameters ([#398](#398))
  * Adds suppressing logging sensitive API parameters marked with the `sensitive` trait. This prevents the API type's `String` method returning a string representation of the API type with sensitive fields printed such as keys and passwords.
  * Related to [aws/aws-sdk-go#2310](aws/aws-sdk-go#2310)
  * Fixes [#251](#251)
* `aws/request` : Retryer is now a named field on Request. ([#393](#393))
* `service/s3/s3manager`: Adds `sync.Pool` to allow reuse of part buffers for streaming payloads ([#404](#404))
  * Fixes [#402](#402)
  * Uses the new behavior introduced in V1 [#2863](aws/aws-sdk-go#2863) which allows the reuse of the sync.Pool across multiple Upload request that match part sizes.

### SDK Bugs
* `service/s3/s3manager`: Fix index out of range when a streaming reader returns -1 ([#378](#378))
  * Fixes the S3 Upload Manager's handling of an unbounded streaming reader that returns negative bytes read.
* `internal/ini`: Fix ini parser to handle empty values [#406](#406)
  * Fixes incorrect modifications to the previous token value of the skipper. Adds checks for cases where a skipped statement should be marked as complete and not be ignored.
  * Adds tests for nested and empty field value parsing, along with tests suggested in [aws/aws-sdk-go#2801](aws/aws-sdk-go#2801)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants