Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3026)

Unified Diff: chrome/app/breakpad_win.cc

Issue 14262014: Fix some bugs in the handling of dynamic crash keys. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Initial CL Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/app/breakpad_win.cc
diff --git a/chrome/app/breakpad_win.cc b/chrome/app/breakpad_win.cc
index e5e7be2e580216ff91c2f10fc80cf9ad3e59457b..990e67bfcb32e513a609b5115dc3ed14092c297d 100644
--- a/chrome/app/breakpad_win.cc
+++ b/chrome/app/breakpad_win.cc
@@ -759,12 +759,24 @@ extern "C" void __declspec(dllexport) __cdecl SetNumberOfViews(
void SetCrashKeyValue(const base::StringPiece& key,
const base::StringPiece& value) {
- std::string key_string = key.as_string();
-
+ // CustomInfoEntry limits the length of key and value. If they exceed
+ // their maximum length the underlying string handling functions raise
+ // an exception and prematurely trigger a crash. Truncate here.
+ base::StringPiece safe_key(key.substr(
+ 0, google_breakpad::CustomInfoEntry::kNameMaxLength - 1));
+ base::StringPiece safe_value(value.substr(
+ 0, google_breakpad::CustomInfoEntry::kValueMaxLength - 1));
Robert Sesek 2013/04/16 17:54:29 The crash_logging system should be doing this trun
Roger McFarlane (Chromium) 2013/04/16 18:18:23 What I've observed is that if you get down to entr
+
+ // Keep a copy of the safe key as a std::string, we'll reuse it later.
+ std::string key_string(safe_key.begin(), safe_key.end());
+
+ // If we already have a value for this key, update it; otherwise, insert
+ // the new value if we have not exhausted the pre-allocated slots for dynamic
+ // entries.
DynamicEntriesMap::iterator it = g_dynamic_entries->find(key_string);
google_breakpad::CustomInfoEntry* entry = NULL;
if (it == g_dynamic_entries->end()) {
- if (g_dynamic_keys_offset >= g_dynamic_entries_count)
+ if (g_dynamic_entries->size() >= g_dynamic_entries_count)
return;
entry = &(*g_custom_entries)[g_dynamic_keys_offset++];
g_dynamic_entries->insert(std::make_pair(key_string, entry));
@@ -772,7 +784,7 @@ void SetCrashKeyValue(const base::StringPiece& key,
entry = it->second;
}
- entry->set(UTF8ToWide(key).data(), UTF8ToWide(value).data());
+ entry->set(UTF8ToWide(safe_key).data(), UTF8ToWide(safe_value).data());
}
extern "C" void __declspec(dllexport) __cdecl SetCrashKeyValuePair(
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698