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);