]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw_file: fix zipper crash(es) in RGWCopyObj
authorMatt Benjamin <mbenjamin@redhat.com>
Tue, 10 Nov 2020 22:38:23 +0000 (17:38 -0500)
committerMatt Benjamin <mbenjamin@redhat.com>
Wed, 16 Dec 2020 15:41:00 +0000 (10:41 -0500)
Instantiate zipper object and bucket handles when called from
rgw_rename().

The current change appears potentially valid, but also suggests
topics for further discussion:

1. redundant object and bucket vars (in req_state and RGWOp)
2. semantic implications std::unique_ptr (e.g., redundant handle
   forks)

Signed-off-by: Matt Benjamin <mbenjamin@redhat.com>
src/rgw/rgw_file.h
src/rgw/rgw_op.cc

index c79293e73416de64eca7c5a150d2b49ffa71d4e0..1bf87efe111a4f274f03d49440732224a04d6328 100644 (file)
@@ -2619,9 +2619,6 @@ public:
 
     src_bucket_name = src_parent->bucket_name();
     // need s->src_bucket_name?
-    src_object->set_name(src_parent->format_child_name(src_name, false));
-    // need s->src_object?
-
     dest_bucket_name = dst_parent->bucket_name();
     // need s->bucket.name?
     dest_obj_name = dst_parent->format_child_name(dst_name, false);
@@ -2655,6 +2652,10 @@ public:
     /* we don't have (any) headers, so just create canned ACLs */
     int ret = s3policy.create_canned(s->owner, s->bucket_owner, s->canned_acl);
     dest_policy = s3policy;
+    /* src_object required before RGWCopyObj::verify_permissions() */
+    rgw_obj_key k = rgw_obj_key(src_name);
+    src_object = rgwlib.get_store()->get_object(k);
+    s->object = src_object->clone(); // needed to avoid trap at rgw_op.cc:5150
     return ret;
   }
 
index d7b9f11180ee8e9f7f6d8072a0f8aa151b8efd1b..536fc98cf90ca6eb01ce14296cb76412443df828 100644 (file)
@@ -5110,6 +5110,11 @@ void RGWCopyObj::execute(optional_yield y)
   if (init_common() < 0)
     return;
 
+  if (! s->object->get_bucket()) {
+    s->bucket = src_object->get_bucket()->clone();
+    s->object->set_bucket(s->bucket.get());
+  }
+
   // make reservation for notification if needed
   rgw::notify::reservation_t res(store, s, s->object.get());
   const auto event_type = rgw::notify::ObjectCreatedCopy;