From dc24a1be2e1b3a312a698b0f84a73b4c66fcefe8 Mon Sep 17 00:00:00 2001 From: yuliyang Date: Mon, 9 Apr 2018 13:12:42 +0800 Subject: [PATCH] rgw: If use 'copy part' without 'x-amz-copy-source-range', it will copy an entire source object Signed-off-by: Malcolm Lee (cherry picked from commit 753b3a7) Conflicts: 1. in original commit, copy_source is std::string, jewel version is const char *. 2. in original commit, url_decode take only one param, jewel version take 2 params. 3. in original commit, get_obj_state take 6 params, jewel version takes 4 params. --- src/rgw/rgw_op.cc | 21 ++++++++++++++++++++- src/rgw/rgw_rest_s3.cc | 8 ++++++-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 42a15e3593b75..18f7565e4e671 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -2669,9 +2669,28 @@ void RGWPutObj::execute() << dendl; goto done; } + + if (copy_source && !copy_source_range) { + rgw_obj_key obj_key(copy_source_object_name, copy_source_version_id); + rgw_obj obj(copy_source_bucket_info.bucket, obj_key.name); + + RGWObjState *astate; + op_ret = store->get_obj_state(static_cast(s->obj_ctx), + obj, &astate, true); + if (op_ret < 0) { + ldout(s->cct, 0) << "ERROR: get copy source obj state returned with error" << op_ret << dendl; + goto done; + } + if (!astate->exists){ + op_ret = -ENOENT; + goto done; + } + lst = astate->size - 1; + } else { + lst = copy_source_range_lst; + } fst = copy_source_range_fst; - lst = copy_source_range_lst; do { bufferlist data_in; diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index 3dd9826927a10..8829178b29bf9 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -3228,8 +3228,12 @@ int RGWHandler_REST_S3::init(RGWRados *store, struct req_state *s, const char *copy_source = s->info.env->get("HTTP_X_AMZ_COPY_SOURCE"); - if (copy_source && !s->info.env->get("HTTP_X_AMZ_COPY_SOURCE_RANGE")) { - ret = RGWCopyObj::parse_copy_location(copy_source, + if (copy_source && + (! s->info.env->get("HTTP_X_AMZ_COPY_SOURCE_RANGE")) && + (! s->info.args.exists("uploadId"))) { + std::string url_decode_copy_source; + url_decode(copy_source, url_decode_copy_source); + ret = RGWCopyObj::parse_copy_location(url_decode_copy_source, s->init_state.src_bucket, s->src_object); if (!ret) { -- 2.39.5