]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgwlc: fix clause counting in LCFilter_S3::decode_xml() 37160/head
authorMatt Benjamin <mbenjamin@redhat.com>
Tue, 15 Sep 2020 12:55:59 +0000 (08:55 -0400)
committerMatt Benjamin <mbenjamin@redhat.com>
Thu, 24 Sep 2020 18:29:28 +0000 (14:29 -0400)
The logic is not a structural parse, so remove the unreliable
logic to match And to Filter clauses.  Accept any number of tags
(including 1) after Prefix.

Empty Filter is allowed:
https://docs.aws.amazon.com/AmazonS3/latest/dev/intro-lifecycle-rules.html

Fixes: https://tracker.ceph.com/issues/47472
Signed-off-by: Matt Benjamin <mbenjamin@redhat.com>
src/rgw/rgw_lc.h
src/rgw/rgw_lc_s3.cc

index 7ab3296e995d8f1bc9195454ff562b026c6c0819..b0e87efba76ce8615882b4bbd95e05bbafdfd703 100644 (file)
@@ -184,9 +184,6 @@ class LCFilter
   bool has_multi_condition() const {
     if (obj_tags.count() > 1)
       return true;
-    else if (has_prefix() && has_tags())
-      return true;
-
     return false;
   }
 
index 712a6ed4dad0fd2e531f7413e9ce27e6b32a9643..cba2b00c0f86c0aff380f9735e45bd8a7640b43e 100644 (file)
@@ -128,20 +128,21 @@ void LCFilter_S3::dump_xml(Formatter *f) const
 
 void LCFilter_S3::decode_xml(XMLObj *obj)
 {
+  /*
+   * The prior logic here looked for an And element, but did not
+   * structurally parse the Filter clause (and incorrectly rejected
+   * the base case where a Prefix and one Tag were supplied).  It
+   * could not reject generally malformed Filter syntax.
+   *
+   * Empty filters are allowed:
+   * https://docs.aws.amazon.com/AmazonS3/latest/dev/intro-lifecycle-rules.html
+   */
   XMLObj *o = obj->find_first("And");
-  bool single_cond = false;
-  int num_conditions = 0;
-  // If there is an AND condition, every tag is a child of and
-  // else we only support single conditions and return false if we see multiple
-
   if (o == nullptr){
     o = obj;
-    single_cond = true;
   }
 
   RGWXMLDecoder::decode_xml("Prefix", prefix, o);
-  if (!prefix.empty())
-    num_conditions++;
   auto tags_iter = o->find("Tag");
   obj_tags.clear();
   while (auto tag_xml =tags_iter.get_next()){
@@ -149,11 +150,6 @@ void LCFilter_S3::decode_xml(XMLObj *obj)
     RGWXMLDecoder::decode_xml("Key", _key, tag_xml);
     RGWXMLDecoder::decode_xml("Value", _val, tag_xml);
     obj_tags.emplace_tag(std::move(_key), std::move(_val));
-    num_conditions++;
-  }
-
-  if (single_cond && num_conditions > 1) {
-    throw RGWXMLDecoder::err("Bad filter: badly formed multiple conditions");
   }
 }