From 8605595e004c2f7b3d9851769394aa56e58eea93 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 (cherry picked from commit d5a85e681f05f2b680bfe771ac16704b374218c7) --- 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 900c9dd56f3..e8dc2e138ae 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -4765,7 +4765,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 463a2b90838..346c518ff34 100644 --- a/src/rgw/rgw_op.h +++ b/src/rgw/rgw_op.h @@ -1310,8 +1310,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 092e753569f..60e5cbd42fa 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -2213,11 +2213,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 @@ -2226,6 +2226,7 @@ int RGWCopyObj_ObjStore_S3::get_params() ldout(s->cct, 0) << s->err.message << dendl; return -EINVAL; } + md_directive = tmp_md_d; } if (source_zone.empty() && -- 2.47.3