]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: Don't crash on copy when metadata directive not supplied 28949/head
authorAdam C. Emerson <aemerson@redhat.com>
Tue, 9 Jul 2019 21:34:51 +0000 (17:34 -0400)
committerAdam C. Emerson <aemerson@redhat.com>
Wed, 10 Jul 2019 14:53:24 +0000 (10:53 -0400)
Fixes: http://tracker.ceph.com/issues/40416
Signed-off-by: Adam C. Emerson <aemerson@redhat.com>
src/rgw/rgw_op.cc
src/rgw/rgw_op.h
src/rgw/rgw_rest_s3.cc

index 32971653f7c023ff74b517f3c95bf6a109eabb3f..78200207a65901050afe3a434afdbe1168ca3ab4 100644 (file)
@@ -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,
index e537669e2f846390a1aa76f4523e433da0cced85..ecbedde64adbeec4b5006627b8a8f572486736ae 100644 (file)
@@ -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<std::string_view> md_directive;
 
   off_t ofs;
   off_t len;
index bda79d16135a8ea0428e7f87ba872500c64029a4..f33665a9ae7ba16cc83d491c91cbf3a9bb601863 100644 (file)
@@ -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() &&