]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
DNM testing wip-jfw-common-ceph_json-parsebug 62438/head
authorJesse F. Williamson <jfw@ibm.com>
Fri, 21 Mar 2025 15:57:07 +0000 (08:57 -0700)
committerJesse F. Williamson <jfw@ibm.com>
Fri, 21 Mar 2025 17:52:28 +0000 (10:52 -0700)
Signed-off-by: Jesse F. Williamson <jfw@ibm.com>
src/common/ceph_json.cc
src/common/ceph_json.h
src/rgw/rgw_policy_s3.cc

index 77aceb8b3ac820a4c4588e1ced708a1c2ec0c105..dbab32105a15aaa2234b081c8d9b3453ae1710bd 100644 (file)
@@ -146,6 +146,40 @@ bool JSONParser::parse(std::string_view json_string_view)
   return false; 
 }
 
+bool JSONParser::parse(const char *buf_, int len)
+{
+  if (nullptr == buf_ || 0 >= len) {
+   return false;
+  }
+
+  if (!parse_json({ buf_, static_cast<size_t>(len) }, data)) {
+   return false;
+  }
+
+  // recursively evaluate the result:
+  handle_value(data);
+
+  if (data.is_object() or data.is_array()) 
+   return true;
+
+  if (data.is_string()) {
+    val.set(data.as_string(), true);
+    return true;
+  } 
+
+  // For any other kind of value:
+  std::string s = boost::json::serialize(data);
+
+  // Was the entire string read?
+  if (s.size() == static_cast<uint64_t>(len)) { 
+    val.set(s, false);
+    return true;
+  }
+
+  // Could not parse and convert:
+  return false; 
+}
+
 // parse a supplied ifstream:
 bool JSONParser::parse(const char *file_name)
 {
index 58416401b3f477bc23fd9fa2651f9039212a2a32..0c4c8cd10dc83f5cebeb505604f2f25daa322db8 100644 (file)
@@ -289,12 +289,7 @@ public:
 
   // operate on a string/stringlike range or object:
   bool parse(std::string_view sv);
-
-  bool parse(const char *buf_, int len) {
-       return buf_ ? 
-               parse(std::string_view { buf_, static_cast<std::string_view::size_type>(len) }) 
-              : false;
-  }
+  bool parse(const char *buf_, int len);
 
   // operate on a data file:
   bool parse(const char *file_name);
index d734249ed2c3bcb6d3ba847ab134922e430b6d1c..0414dd5cdebbcacac966d6f90934d7f1a9bb0d3b 100644 (file)
@@ -250,7 +250,7 @@ int RGWPolicy::from_json(bufferlist& bl, string& err_msg)
 
   // Without subtracting 1, we wind up sending bad data into the
   // parser:
-  if (!parser.parse(bl.c_str(), bl.length() - 1)) {
+  if (!parser.parse(bl.c_str(), bl.length())) {
     err_msg = "Malformed JSON (RGWPolicy)";
     dout(0) << "malformed json (RGWPolicy)" << dendl;
     return -EINVAL;