From: Tianshan Qu Date: Sun, 11 Nov 2018 11:56:51 +0000 (+0800) Subject: rgw: set null version object acl issues X-Git-Tag: v12.2.13~30^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=7b7e67a895244db46c4e87af7c71d844f8448fb4;p=ceph.git rgw: set null version object acl issues 1.set null version object acl will create empty index RGWRados::set_attrs did not clear instance, so index prepare, complete got instance=null, which lead to empty index 1000__i_null. there is no harm to create empty index, but listomapkeys to find that key. 2.if object is exist with versioned key, we can set none exists null version object order: 1) enable bucket version 2) put obj 3) disable bucket version 4) set versoned_id=null acl will succeed which should not Fixes: http://tracker.ceph.com/issues/36763 Signed-off-by: Tianshan Qu (cherry picked from commit ca6e5c89e8d6da498da15f0eea4bcd4d271b44e9) --- diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index a024a13af74ba..d894f4d1a8b56 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -10038,10 +10038,15 @@ int RGWRados::set_attr(void *ctx, const RGWBucketInfo& bucket_info, rgw_obj& obj return set_attrs(ctx, bucket_info, obj, attrs, NULL); } -int RGWRados::set_attrs(void *ctx, const RGWBucketInfo& bucket_info, rgw_obj& obj, +int RGWRados::set_attrs(void *ctx, const RGWBucketInfo& bucket_info, rgw_obj& src_obj, map& attrs, map* rmattrs) { + rgw_obj obj = src_obj; + if (obj.key.instance == "null") { + obj.key.instance.clear(); + } + rgw_rados_ref ref; int r = get_obj_head_ref(bucket_info, obj, &ref); if (r < 0) { @@ -10056,6 +10061,11 @@ int RGWRados::set_attrs(void *ctx, const RGWBucketInfo& bucket_info, rgw_obj& ob if (r < 0) return r; + // ensure null version object exist + if (src_obj.key.instance == "null" && !state->has_manifest) { + return -ENOENT; + } + map::iterator iter; if (rmattrs) { for (iter = rmattrs->begin(); iter != rmattrs->end(); ++iter) {