From 7a75a6e9a770f587964346ca58c014f4ada93ad7 Mon Sep 17 00:00:00 2001 From: Daniel Gryniewicz Date: Thu, 5 Nov 2020 14:02:04 -0500 Subject: [PATCH] RGW - Don't create empty obj in webdir Zipper objects shouldn't be empty, but should instead be null. Fix this case where parsing wasn't checking for empty object name, and the website code that uses it. Fixes: https://tracker.ceph.com/issues/48049 Signed-off-by: Daniel Gryniewicz --- src/rgw/rgw_rest_s3.cc | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index eb50d643577b..0722e8fffad2 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -4594,8 +4594,12 @@ int RGWHandler_REST_S3::init_from_header(rgw::sal::RGWRadosStore *store, if (s->init_state.url_bucket.empty()) { // Save bucket to tide us over until token is parsed. s->init_state.url_bucket = first; + string encoded_obj_str; if (pos >= 0) { - string encoded_obj_str = req.substr(pos+1); + encoded_obj_str = req.substr(pos+1); + } + + 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"))); } else { @@ -4862,7 +4866,10 @@ RGWHandler_REST* RGWRESTMgr_S3::get_handler(rgw::sal::RGWRadosStore *store, } bool RGWHandler_REST_S3Website::web_dir() const { - std::string subdir_name = url_decode(s->object->get_name()); + std::string subdir_name; + if (!rgw::sal::RGWObject::empty(s->object.get())) { + subdir_name = url_decode(s->object->get_name()); + } if (subdir_name.empty()) { return false; @@ -4922,14 +4929,18 @@ int RGWHandler_REST_S3Website::retarget(RGWOp* op, RGWOp** new_op) { } rgw_obj_key new_obj; - bool get_res = s->bucket->get_info().website_conf.get_effective_key(s->object->get_name(), &new_obj.name, web_dir()); + string key_name; + if (!rgw::sal::RGWObject::empty(s->object.get())) { + key_name = s->object->get_name(); + } + bool get_res = s->bucket->get_info().website_conf.get_effective_key(key_name, &new_obj.name, web_dir()); if (!get_res) { s->err.message = "The IndexDocument Suffix is not configurated or not well formed!"; ldpp_dout(s, 5) << s->err.message << dendl; return -EINVAL; } - ldpp_dout(s, 10) << "retarget get_effective_key " << s->object->get_key() << " -> " + ldpp_dout(s, 10) << "retarget get_effective_key " << s->object << " -> " << new_obj << dendl; RGWBWRoutingRule rrule; @@ -4941,7 +4952,7 @@ int RGWHandler_REST_S3Website::retarget(RGWOp* op, RGWOp** new_op) { const string& protocol = (s->info.env->get("SERVER_PORT_SECURE") ? "https" : "http"); int redirect_code = 0; - rrule.apply_rule(protocol, hostname, s->object->get_name(), &s->redirect, + rrule.apply_rule(protocol, hostname, key_name, &s->redirect, &redirect_code); // APply a custom HTTP response code if (redirect_code > 0) @@ -4958,6 +4969,7 @@ int RGWHandler_REST_S3Website::retarget(RGWOp* op, RGWOp** new_op) { */ s->object = store->get_object(new_obj); + s->object->set_bucket(s->bucket.get()); return 0; } -- 2.47.3