From d5a85e681f05f2b680bfe771ac16704b374218c7 Mon Sep 17 00:00:00 2001 From: "Adam C. Emerson" Date: Tue, 9 Jul 2019 17:34:51 -0400 Subject: [PATCH] rgw: Don't crash on copy when metadata directive not supplied Fixes: http://tracker.ceph.com/issues/40416 Signed-off-by: Adam C. Emerson --- src/rgw/rgw_op.cc | 4 +++- src/rgw/rgw_op.h | 6 ++++-- src/rgw/rgw_rest_s3.cc | 9 +++++---- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 32971653f7c..78200207a65 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -4945,7 +4945,9 @@ int RGWCopyObj::verify_permission() if (! s->auth.identity->is_admin_of(dest_policy.get_owner().get_id())){ if (dest_iam_policy != boost::none) { rgw_add_to_iam_environment(s->env, "s3:x-amz-copy-source", copy_source); - rgw_add_to_iam_environment(s->env, "s3:x-amz-metadata-directive", md_directive); + if (md_directive) + rgw_add_to_iam_environment(s->env, "s3:x-amz-metadata-directive", + *md_directive); auto e = dest_iam_policy->eval(s->env, *s->auth.identity, rgw::IAM::s3PutObject, diff --git a/src/rgw/rgw_op.h b/src/rgw/rgw_op.h index e537669e2f8..ecbedde64ad 100644 --- a/src/rgw/rgw_op.h +++ b/src/rgw/rgw_op.h @@ -1371,8 +1371,10 @@ protected: const char *if_unmod; const char *if_match; const char *if_nomatch; - const char *copy_source = nullptr; - const char *md_directive = nullptr; + // Required or it is not a copy operation + std::string_view copy_source; + // Not actually required + std::optional md_directive; off_t ofs; off_t len; diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index bda79d16135..f33665a9ae7 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -2580,11 +2580,11 @@ int RGWCopyObj_ObjStore_S3::get_params() } copy_source = s->info.env->get("HTTP_X_AMZ_COPY_SOURCE"); - md_directive = s->info.env->get("HTTP_X_AMZ_METADATA_DIRECTIVE"); - if (md_directive) { - if (strcasecmp(md_directive, "COPY") == 0) { + auto tmp_md_d = s->info.env->get("HTTP_X_AMZ_METADATA_DIRECTIVE"); + if (tmp_md_d) { + if (strcasecmp(tmp_md_d, "COPY") == 0) { attrs_mod = RGWRados::ATTRSMOD_NONE; - } else if (strcasecmp(md_directive, "REPLACE") == 0) { + } else if (strcasecmp(tmp_md_d, "REPLACE") == 0) { attrs_mod = RGWRados::ATTRSMOD_REPLACE; } else if (!source_zone.empty()) { attrs_mod = RGWRados::ATTRSMOD_NONE; // default for intra-zone_group copy @@ -2593,6 +2593,7 @@ int RGWCopyObj_ObjStore_S3::get_params() ldpp_dout(this, 0) << s->err.message << dendl; return -EINVAL; } + md_directive = tmp_md_d; } if (source_zone.empty() && -- 2.47.3