buffet: Improve error reporting by limiting JSON string length

Log messages are limited to 2000 characters. If JSON strings are
too long and fail to be parsed, the actual parse error portion of
the log message is truncated.

Limit the length of JSON strings quoted in error logs to 1700 chars
to leave some room for other parts of the error message.

BUG=None
TEST=`FEATURES=test emerge-link buffet`

Change-Id: I72f4e2c135c74366cd84e87e1a589a6a3423c154
Reviewed-on: https://chromium-review.googlesource.com/264937
Reviewed-by: Vitaly Buka <vitalybuka@chromium.org>
Trybot-Ready: Alex Vakulenko <avakulenko@chromium.org>
Tested-by: Alex Vakulenko <avakulenko@chromium.org>
Commit-Queue: Alex Vakulenko <avakulenko@chromium.org>
diff --git a/buffet/utils.cc b/buffet/utils.cc
index 8e29ebe..5a9c154 100644
--- a/buffet/utils.cc
+++ b/buffet/utils.cc
@@ -13,6 +13,20 @@
 
 namespace buffet {
 
+namespace {
+
+// Truncates a string if it is too long. Used for error reporting with really
+// long JSON strings.
+std::string LimitString(const std::string& text, size_t max_len) {
+  if (text.size() <= max_len)
+    return text;
+  return text.substr(0, max_len - 3) + "...";
+}
+
+const size_t kMaxStrLen = 1700;  // Log messages are limited to 2000 chars.
+
+}  // anonymous namespace
+
 const char kErrorDomainBuffet[] = "buffet";
 const char kFileReadError[] = "file_read_error";
 const char kInvalidCategoryError[] = "invalid_category";
@@ -43,7 +57,7 @@
                                  chromeos::errors::json::kDomain,
                                  chromeos::errors::json::kParseError,
                                  "Error parsing JSON string '%s': %s",
-                                 json_string.c_str(),
+                                 LimitString(json_string, kMaxStrLen).c_str(),
                                  error_message.c_str());
     return result;
   }
@@ -54,7 +68,7 @@
                                  chromeos::errors::json::kDomain,
                                  chromeos::errors::json::kObjectExpected,
                                  "JSON string '%s' is not a JSON object",
-                                 json_string.c_str());
+                                 LimitString(json_string, kMaxStrLen).c_str());
     return result;
   }
   result.reset(dict_value);