Skip to content

Commit 46d8f75

Browse files
committed
Merge branch 'bugfix/CLDSRV-864-crash-TrailingChecksumTransform-unhandled-error' into q/9.4
2 parents de26545 + 684682c commit 46d8f75

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

lib/api/apiUtils/object/prepareStream.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,14 @@ function prepareStream(stream, streamingV4Params, log, errCb) {
3131
return stream;
3232
}
3333

34-
function stripTrailingChecksumStream(stream, log) {
34+
function stripTrailingChecksumStream(stream, log, errCb) {
3535
// don't do anything if we are not in the correct integrity check mode
3636
if (stream.headers['x-amz-content-sha256'] !== 'STREAMING-UNSIGNED-PAYLOAD-TRAILER') {
3737
return stream;
3838
}
3939

4040
const trailingChecksumTransform = new TrailingChecksumTransform(log);
41+
trailingChecksumTransform.on('error', errCb);
4142
stream.pipe(trailingChecksumTransform);
4243
trailingChecksumTransform.headers = stream.headers;
4344
return trailingChecksumTransform;

tests/unit/auth/TrailingChecksumTransform.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ const async = require('async');
44
const { Readable } = require('stream');
55

66
const TrailingChecksumTransform = require('../../../lib/auth/streamingV4/trailingChecksumTransform');
7+
const { stripTrailingChecksumStream } = require('../../../lib/api/apiUtils/object/prepareStream');
78
const { DummyRequestLogger } = require('../helpers');
89

910
const log = new DummyRequestLogger();
@@ -170,6 +171,28 @@ describe('TrailingChecksumTransform class', () => {
170171
chunkedReader.pipe(trailingChecksumTransform);
171172
});
172173

174+
it('should propagate _flush error via errCb when stream closes without chunked encoding', done => {
175+
const incompleteData = '10\r\n01234\r6789abcd\r\n\r\n';
176+
const source = new ChunkedReader([Buffer.from(incompleteData)]);
177+
source.headers = { 'x-amz-content-sha256': 'STREAMING-UNSIGNED-PAYLOAD-TRAILER' };
178+
const stream = stripTrailingChecksumStream(source, log, err => {
179+
assert.deepStrictEqual(err, errors.InvalidArgument);
180+
done();
181+
});
182+
stream.resume();
183+
});
184+
185+
it('should propagate _transform error via errCb for invalid chunk size', done => {
186+
const badData = '500000000000\r\n';
187+
const source = new ChunkedReader([Buffer.from(badData)]);
188+
source.headers = { 'x-amz-content-sha256': 'STREAMING-UNSIGNED-PAYLOAD-TRAILER' };
189+
const stream = stripTrailingChecksumStream(source, log, err => {
190+
assert.deepStrictEqual(err, errors.InvalidArgument);
191+
done();
192+
});
193+
stream.resume();
194+
});
195+
173196
it('should return early if supplied with an out of specification chunk size', done => {
174197
const trailingChecksumTransform = new TrailingChecksumTransform(log);
175198
const chunks = [

0 commit comments

Comments
 (0)