JSON cannot express arbitrary binary blobs. Instead of outputting invalid
and unparseable JSON, represent the value of blobs as something like
'<<< binary blob of length 12 >>>'.
Fixes: http://tracker.ceph.com/issues/23622
Signed-off-by: Sage Weil <sage@redhat.com>
(cherry picked from commit
4669134b89ee1f7759fb59faef218da0880daa98)
Conflicts:
PendingReleaseNotes: 12.2.6 dropped, will be added in a seperate pr
src/mon/ConfigKeyService.cc (ConfigKeyService::store_dump does not take
prefix argument in luminous)
return false;
}
+static bool is_binary_string(const string& s)
+{
+ for (auto c : s) {
+ // \n and \t are escaped in JSON; other control characters are not.
+ if ((c < 0x20 && c != '\n' && c != '\t') || c >= 0x7f) {
+ return true;
+ }
+ }
+ return false;
+}
+
void ConfigKeyService::store_dump(stringstream &ss)
{
KeyValueDB::Iterator iter =
f.open_object_section("config-key store");
while (iter->valid()) {
- f.dump_string(iter->key().c_str(), iter->value().to_str());
+ string s = iter->value().to_str();
+ if (is_binary_string(s)) {
+ ostringstream ss;
+ ss << "<<< binary blob of length " << s.size() << " >>>";
+ f.dump_string(iter->key().c_str(), ss.str());
+ } else {
+ f.dump_string(iter->key().c_str(), s);
+ }
iter->next();
}
f.close_section();