]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw/rest: req_state stores original object_key/src_object_key
authorCasey Bodley <cbodley@redhat.com>
Fri, 27 Mar 2026 15:01:40 +0000 (11:01 -0400)
committerCasey Bodley <cbodley@redhat.com>
Fri, 27 Mar 2026 15:12:59 +0000 (11:12 -0400)
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 <cbodley@redhat.com>
src/rgw/rgw_common.h
src/rgw/rgw_file_int.h
src/rgw/rgw_os_lib.cc
src/rgw/rgw_rest_s3.cc
src/rgw/rgw_rest_swift.cc

index 8f95f4ef6716971ba1228754ca6569231817c09b..fc32b91fae20d3b17b31b99ba2c65d136e1baff1 100644 (file)
@@ -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<rgw::sal::Object> 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<rgw::sal::Object> src_object;
   ACLOwner bucket_owner;
   // Resource owner for the authenticated identity, initialized in authorize()
index a001b85ee8cc0905fbe0033a73f3a0de28a697a1..ddb52c4e27c9d947b4545098fc034727a969c4e0 100644 (file)
@@ -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;
   }
 
index ae2c89929559e864171a3036598925f494dc0bcb..51af9acd7d8e2b90a73c284769b389e77072775f 100644 (file)
@@ -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 */
index a90346b6886ad56e602f4bfd3a0308ce781e4333..3fb322fa61e7b00611203ef2abaf548b07fcff17 100644 (file)
@@ -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);
index bc442840fa0fe3c445bdc3882831278fc3d1d065..e113daad0429e8f1a0b058661dbb49388a082953 100644 (file)
@@ -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;
   }