From c3b504df07cb83e34aa3d9f4f882f1b3c99f066e Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Wed, 31 Oct 2018 13:22:48 -0700 Subject: [PATCH] rgw: prevent creation of bucket with non-existent storage class Signed-off-by: Yehuda Sadeh --- src/rgw/rgw_zone.h | 9 +++++++++ src/rgw/services/svc_zone.cc | 7 ++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/rgw/rgw_zone.h b/src/rgw/rgw_zone.h index 22f638eecef..adee749d657 100644 --- a/src/rgw/rgw_zone.h +++ b/src/rgw/rgw_zone.h @@ -208,6 +208,11 @@ public: return true; } + bool exists(const string& sc) const { + auto iter = m.find(sc); + return (iter != m.end()); + } + const map& get_all() const { return m; } @@ -330,6 +335,10 @@ struct RGWZonePlacementInfo { return storage_class->compression_type.get_value_or(no_compression); } + bool storage_class_exists(const string& sc) const { + return storage_classes.exists(sc); + } + void dump(Formatter *f) const; void decode_json(JSONObj *obj); diff --git a/src/rgw/services/svc_zone.cc b/src/rgw/services/svc_zone.cc index aa3d7458084..d8368fb7c2f 100644 --- a/src/rgw/services/svc_zone.cc +++ b/src/rgw/services/svc_zone.cc @@ -1038,7 +1038,12 @@ int RGWSI_Zone::select_bucket_location_by_rule(const rgw_placement_rule& locatio return -EINVAL; } -#warning FIXME check that location_rule.storage_class exists in piter->second + auto storage_class = location_rule.get_storage_class(); + if (!piter->second.storage_class_exists(storage_class)) { + ldout(cct, 5) << "requested storage class does not exist: " << storage_class << dendl; + return -EINVAL; + } + RGWZonePlacementInfo& placement_info = piter->second; -- 2.47.3