From: Casey Bodley Date: Fri, 27 Mar 2026 15:01:40 +0000 (-0400) Subject: rgw/rest: req_state stores original object_key/src_object_key X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f9cf6f6e8b106c444aa33b90ca2c86440452dfa4;p=ceph.git rgw/rest: req_state stores original object_key/src_object_key parse the requested object name/version into req_state::object_key and src_object_key instead of relying on sal::Object to preserve it all code paths that assigned to req_state::object or src_object now first assign to the key Signed-off-by: Casey Bodley --- diff --git a/src/rgw/rgw_common.h b/src/rgw/rgw_common.h index 8f95f4ef6716..fc32b91fae20 100644 --- a/src/rgw/rgw_common.h +++ b/src/rgw/rgw_common.h @@ -1334,6 +1334,7 @@ struct req_state : DoutPrefixProvider { std::string bucket_tenant; std::string bucket_name; + rgw_obj_key object_key; // requested object name and version id /* bucket is only created in rgw_build_bucket_policies() and should never be * overwritten */ @@ -1341,6 +1342,7 @@ struct req_state : DoutPrefixProvider { std::unique_ptr object; std::string src_tenant_name; std::string src_bucket_name; + rgw_obj_key src_object_key; // requested source object name and version id std::unique_ptr src_object; ACLOwner bucket_owner; // Resource owner for the authenticated identity, initialized in authorize() diff --git a/src/rgw/rgw_file_int.h b/src/rgw/rgw_file_int.h index a001b85ee8cc..ddb52c4e27c9 100644 --- a/src/rgw/rgw_file_int.h +++ b/src/rgw/rgw_file_int.h @@ -2585,7 +2585,8 @@ public: if (rc != 0) return rc; - state->object = RGWHandler::driver->get_object(rgw_obj_key(dst_obj_name)); + state->object_key = dst_obj_name; + state->object = RGWHandler::driver->get_object(state->object_key); /* XXX and fixup key attr (could optimize w/string ref and * dest_obj_name) */ @@ -2610,8 +2611,8 @@ public: /* we don't have (any) headers, so just create default ACLs */ dest_policy.create_default(s->owner.id, s->owner.display_name); /* src_object required before RGWCopyObj::verify_permissions() */ - rgw_obj_key k = rgw_obj_key(src_obj_name); - s->src_object = s->bucket->get_object(k); + s->src_object_key = src_obj_name; + s->src_object = s->bucket->get_object(s->src_object_key); return 0; } diff --git a/src/rgw/rgw_os_lib.cc b/src/rgw/rgw_os_lib.cc index ae2c89929559..51af9acd7d8e 100644 --- a/src/rgw/rgw_os_lib.cc +++ b/src/rgw/rgw_os_lib.cc @@ -51,11 +51,14 @@ namespace rgw { s->bucket_name = std::move(first); if (pos >= 0) { // XXX ugh, another copy - string encoded_obj_str = req.substr(pos+1); - s->object = driver->get_object(rgw_obj_key(encoded_obj_str, s->info.args.get("versionId"))); + s->object_key.name = req.substr(pos+1); + s->object_key.instance = s->info.args.get("versionId"); + s->object = driver->get_object(s->object_key); } } else { - s->object = driver->get_object(rgw_obj_key(req_name, s->info.args.get("versionId"))); + s->object_key.name = req_name; + s->object_key.instance = s->info.args.get("versionId"); + s->object = driver->get_object(s->object_key); } return 0; } /* init_from_header */ diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index a90346b6886a..3fb322fa61e7 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -3186,7 +3186,8 @@ int RGWPostObj_ObjStore_S3::get_params(optional_yield y) return -EINVAL; } - s->object = s->bucket->get_object(rgw_obj_key(object_str)); + s->object_key = object_str; + s->object = s->bucket->get_object(s->object_key); rebuild_key(s->object.get()); @@ -5627,20 +5628,26 @@ int RGWHandler_REST_S3::init_from_header(rgw::sal::Driver* driver, encoded_obj_str = req.substr(pos+1); } + s->object_key.name = encoded_obj_str; + s->object_key.instance = s->info.args.get("versionId"); + /* dang: s->bucket is never set here, since it's created with permissions. * These calls will always create an object with no bucket. */ if (!encoded_obj_str.empty()) { if (s->bucket) { - s->object = s->bucket->get_object(rgw_obj_key(encoded_obj_str, s->info.args.get("versionId"))); + s->object = s->bucket->get_object(s->object_key); } else { - s->object = driver->get_object(rgw_obj_key(encoded_obj_str, s->info.args.get("versionId"))); + s->object = driver->get_object(s->object_key); } } } else { + s->object_key.name = req_name; + s->object_key.instance = s->info.args.get("versionId"); + if (s->bucket) { - s->object = s->bucket->get_object(rgw_obj_key(req_name, s->info.args.get("versionId"))); + s->object = s->bucket->get_object(s->object_key); } else { - s->object = driver->get_object(rgw_obj_key(req_name, s->info.args.get("versionId"))); + s->object = driver->get_object(s->object_key); } } return 0; @@ -5725,6 +5732,7 @@ int RGWHandler_REST_S3::init(rgw::sal::Driver* driver, req_state *s, ldpp_dout(s, 0) << "failed to parse copy location" << dendl; return -EINVAL; // XXX why not -ERR_INVALID_BUCKET_NAME or -ERR_BAD_URL? } + s->src_object_key = key; s->src_object = driver->get_object(key); } @@ -6096,6 +6104,7 @@ int RGWHandler_REST_S3Website::retarget(RGWOp* op, RGWOp** new_op, optional_yiel * dang: This could be problematic, since we're not actually replacing op, but * we are replacing s->object. Something might have a pointer to it. */ + s->object_key = new_obj; s->object = s->bucket->get_object(new_obj); return 0; @@ -6128,6 +6137,7 @@ int RGWHandler_REST_S3Website::serve_errordoc(const DoutPrefixProvider *dpp, int /* This is okay. It's an error, so nothing will run after this, and it can be * called by abort_early(), which can be called before s->object or s->bucket * are set up. Note, it won't have bucket. */ + s->object_key = errordoc_key; s->object = driver->get_object(errordoc_key); ret = init_permissions(getop.get(), y); diff --git a/src/rgw/rgw_rest_swift.cc b/src/rgw/rgw_rest_swift.cc index bc442840fa0f..e113daad0429 100644 --- a/src/rgw/rgw_rest_swift.cc +++ b/src/rgw/rgw_rest_swift.cc @@ -2510,10 +2510,11 @@ int RGWSwiftWebsiteHandler::serve_errordoc(const int http_ret, /* This is okay. It's an error, so nothing will run after this, and it can be * called by abort_early(), which can be called before s->object or s->bucket * are set up. */ + s->object_key = std::to_string(http_ret) + error_doc; if (!rgw::sal::Bucket::empty(s->bucket.get())) { - s->object = s->bucket->get_object(rgw_obj_key(std::to_string(http_ret) + error_doc)); + s->object = s->bucket->get_object(s->object_key); } else { - s->object = driver->get_object(rgw_obj_key(std::to_string(http_ret) + error_doc)); + s->object = driver->get_object(s->object_key); } RGWOp* newop = &get_errpage_op; @@ -3166,8 +3167,9 @@ int RGWHandler_REST_SWIFT::init_from_header(rgw::sal::Driver* driver, s->init_state.url_bucket = first; if (req.size()) { - s->object = driver->get_object( - rgw_obj_key(req, s->info.env->get("HTTP_X_OBJECT_VERSION_ID", ""))); /* rgw swift extension */ + s->object_key.name = req; + s->object_key.instance = s->info.env->get("HTTP_X_OBJECT_VERSION_ID", ""); /* rgw swift extension */ + s->object = driver->get_object(s->object_key); s->info.effective_uri.append("/" + s->object->get_name()); } @@ -3187,6 +3189,7 @@ int RGWHandler_REST_SWIFT::init(rgw::sal::Driver* driver, req_state* s, bool result = RGWCopyObj::parse_copy_location(copy_source, t->src_bucket, key, s); if (!result) return -ERR_BAD_URL; + s->src_object_key = key; s->src_object = driver->get_object(key); if (!s->src_object) return -ERR_BAD_URL; @@ -3209,8 +3212,10 @@ int RGWHandler_REST_SWIFT::init(rgw::sal::Driver* driver, req_state* s, /* convert COPY operation into PUT */ t->src_bucket = t->url_bucket; + s->src_object_key = s->object_key; s->src_object = s->object->clone(); t->url_bucket = dest_bucket_name; + s->object_key.name = dest_object_name; s->object->set_name(dest_object_name); s->op = OP_PUT; }