From 6ac2eacf69dee4f9129bf8be37967e47fff630ff Mon Sep 17 00:00:00 2001 From: Matt Benjamin Date: Tue, 10 Nov 2020 17:38:23 -0500 Subject: [PATCH] rgw_file: fix zipper crash(es) in RGWCopyObj 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 --- src/rgw/rgw_file.h | 7 ++++--- src/rgw/rgw_op.cc | 5 +++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/rgw/rgw_file.h b/src/rgw/rgw_file.h index c79293e7341..1bf87efe111 100644 --- a/src/rgw/rgw_file.h +++ b/src/rgw/rgw_file.h @@ -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; } diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index d7b9f11180e..536fc98cf90 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -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; -- 2.39.5