Skip to content

Commit be2daf0

Browse files
committed
CLDSRV-909: Reject CopyObject when source exceeds 5 GiB
1 parent 580d648 commit be2daf0

2 files changed

Lines changed: 56 additions & 1 deletion

File tree

lib/api/objectCopy.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,16 @@ function objectCopy(authInfo, request, sourceBucket,
351351
request.sourceServerAccessLog && (request.sourceServerAccessLog.error = err);
352352
return next(err, destBucketMD);
353353
}
354+
const sourceSize = parseInt(sourceObjMD['content-length'], 10);
355+
if (sourceSize > constants.maximumAllowedUploadSize) {
356+
log.debug('copy source object too large', { sourceSize });
357+
const err = errorInstances.InvalidRequest.customizeDescription(
358+
'The specified copy source is larger than the maximum ' +
359+
`allowable size for a copy source: ${constants.maximumAllowedUploadSize}`);
360+
// eslint-disable-next-line no-param-reassign
361+
request.sourceServerAccessLog && (request.sourceServerAccessLog.error = err);
362+
return next(err, destBucketMD);
363+
}
354364
const headerValResult =
355365
validateHeaders(request.headers,
356366
sourceObjMD['last-modified'],

tests/unit/api/objectCopy.js

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ const { cleanup, DummyRequestLogger, makeAuthInfo, versioningTestUtils }
1414
const mpuUtils = require('../utils/mpuUtils');
1515
const metadata = require('../metadataswitch');
1616
const { data } = require('../../../lib/data/wrapper');
17-
const { objectLocationConstraintHeader } = require('../../../constants');
17+
const constants = require('../../../constants');
18+
const { objectLocationConstraintHeader } = constants;
1819
const { fakeMetadataArchive } = require('../../functional/aws-node-sdk/test/utils/init');
1920
const { config } = require('../../../lib/Config');
2021

@@ -640,3 +641,47 @@ describe('objectCopy with objectKeyByteLimit', () => {
640641
});
641642
});
642643
});
644+
645+
describe('objectCopy source size limit', () => {
646+
const testPutObjectRequest = versioningTestUtils.createPutObjectRequest(sourceBucketName, objectKey, objData[0]);
647+
const sourceSize = objData[0].length;
648+
let originalMaximumUploadSize;
649+
650+
before(done => {
651+
cleanup();
652+
originalMaximumUploadSize = constants.maximumAllowedUploadSize;
653+
async.series([
654+
callback => bucketPut(authInfo, putDestBucketRequest, log, callback),
655+
callback => bucketPut(authInfo, putSourceBucketRequest, log, callback),
656+
callback => objectPut(authInfo, testPutObjectRequest, undefined, log, callback),
657+
], done);
658+
});
659+
660+
after(() => {
661+
constants.maximumAllowedUploadSize = originalMaximumUploadSize;
662+
cleanup();
663+
});
664+
665+
it('should allow CopyObject when source size equals the limit', done => {
666+
constants.maximumAllowedUploadSize = sourceSize;
667+
const testObjectCopyRequest = _createObjectCopyRequest(destBucketName);
668+
objectCopy(authInfo, testObjectCopyRequest, sourceBucketName, objectKey,
669+
undefined, log, err => {
670+
assert.ifError(err);
671+
done();
672+
});
673+
});
674+
675+
it('should reject CopyObject when source size exceeds the limit', done => {
676+
constants.maximumAllowedUploadSize = sourceSize - 1;
677+
const testObjectCopyRequest = _createObjectCopyRequest(destBucketName);
678+
objectCopy(authInfo, testObjectCopyRequest, sourceBucketName, objectKey,
679+
undefined, log, err => {
680+
assert(err);
681+
assert.strictEqual(err.is.InvalidRequest, true);
682+
assert.match(err.description,
683+
/The specified copy source is larger than the maximum allowable size for a copy source/);
684+
done();
685+
});
686+
});
687+
});

0 commit comments

Comments
 (0)