* Tenants are separated from buckets in URLs by a colon in S3.
* This function is not to be used on Swift URLs, not even for COPY arguments.
*/
-void rgw_parse_url_bucket(const string &bucket, const string& auth_tenant,
- string &tenant_name, string &bucket_name) {
+int rgw_parse_url_bucket(const string &bucket, const string& auth_tenant,
+ string &tenant_name, string &bucket_name) {
int pos = bucket.find(':');
if (pos >= 0) {
*/
tenant_name = bucket.substr(0, pos);
bucket_name = bucket.substr(pos + 1);
+ if (bucket_name.empty()) {
+ return -ERR_INVALID_BUCKET_NAME;
+ }
} else {
tenant_name = auth_tenant;
bucket_name = bucket;
}
+ return 0;
}
int rgw_bucket_parse_bucket_instance(const string& bucket_instance, string *bucket_name, string *bucket_id, int *shard_id)
extern std::string rgw_make_bucket_entry_name(const std::string& tenant_name,
const std::string& bucket_name);
-extern void rgw_parse_url_bucket(const std::string& bucket,
- const std::string& auth_tenant,
- std::string &tenant_name, std::string &bucket_name);
+[[nodiscard]] int rgw_parse_url_bucket(const std::string& bucket,
+ const std::string& auth_tenant,
+ std::string &tenant_name,
+ std::string &bucket_name);
extern int rgw_chown_bucket_and_objects(rgw::sal::Store* store,
rgw::sal::Bucket* bucket,
{
struct req_init_state *t = &s->init_state;
- rgw_parse_url_bucket(t->url_bucket, s->user->get_tenant(),
- s->bucket_tenant, s->bucket_name);
-
+ int ret = rgw_parse_url_bucket(t->url_bucket, s->user->get_tenant(),
+ s->bucket_tenant, s->bucket_name);
+ if (ret) {
+ return ret;
+ }
if (s->auth.identity->get_identity_type() == TYPE_ROLE) {
s->bucket_tenant = s->auth.identity->get_role_tenant();
}
ldpp_dout(s, 10) << "s->object=" << s->object
<< " s->bucket=" << rgw_make_bucket_entry_name(s->bucket_tenant, s->bucket_name) << dendl;
- int ret;
ret = rgw_validate_tenant_name(s->bucket_tenant);
if (ret)
return ret;
} else {
auth_tenant = s->user->get_tenant();
}
- rgw_parse_url_bucket(t->src_bucket, auth_tenant,
- s->src_tenant_name, s->src_bucket_name);
+ ret = rgw_parse_url_bucket(t->src_bucket, auth_tenant,
+ s->src_tenant_name, s->src_bucket_name);
+ if (ret) {
+ return ret;
+ }
ret = rgw_validate_tenant_name(s->src_tenant_name);
if (ret)
return ret;