Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/app/breakpad_win.h" | 5 #include "chrome/app/breakpad_win.h" |
| 6 | 6 |
| 7 #include <shellapi.h> | 7 #include <shellapi.h> |
| 8 #include <tchar.h> | 8 #include <tchar.h> |
| 9 #include <userenv.h> | 9 #include <userenv.h> |
| 10 #include <windows.h> | 10 #include <windows.h> |
| (...skipping 741 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 752 } | 752 } |
| 753 } | 753 } |
| 754 | 754 |
| 755 extern "C" void __declspec(dllexport) __cdecl SetNumberOfViews( | 755 extern "C" void __declspec(dllexport) __cdecl SetNumberOfViews( |
| 756 int number_of_views) { | 756 int number_of_views) { |
| 757 SetIntegerValue(g_num_of_views_offset, number_of_views); | 757 SetIntegerValue(g_num_of_views_offset, number_of_views); |
| 758 } | 758 } |
| 759 | 759 |
| 760 void SetCrashKeyValue(const base::StringPiece& key, | 760 void SetCrashKeyValue(const base::StringPiece& key, |
| 761 const base::StringPiece& value) { | 761 const base::StringPiece& value) { |
| 762 std::string key_string = key.as_string(); | 762 // CustomInfoEntry limits the length of key and value. If they exceed |
| 763 // their maximum length the underlying string handling functions raise | |
| 764 // an exception and prematurely trigger a crash. Truncate here. | |
| 765 base::StringPiece safe_key(key.substr( | |
| 766 0, google_breakpad::CustomInfoEntry::kNameMaxLength - 1)); | |
| 767 base::StringPiece safe_value(value.substr( | |
| 768 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
| |
| 763 | 769 |
| 770 // Keep a copy of the safe key as a std::string, we'll reuse it later. | |
| 771 std::string key_string(safe_key.begin(), safe_key.end()); | |
| 772 | |
| 773 // If we already have a value for this key, update it; otherwise, insert | |
| 774 // the new value if we have not exhausted the pre-allocated slots for dynamic | |
| 775 // entries. | |
| 764 DynamicEntriesMap::iterator it = g_dynamic_entries->find(key_string); | 776 DynamicEntriesMap::iterator it = g_dynamic_entries->find(key_string); |
| 765 google_breakpad::CustomInfoEntry* entry = NULL; | 777 google_breakpad::CustomInfoEntry* entry = NULL; |
| 766 if (it == g_dynamic_entries->end()) { | 778 if (it == g_dynamic_entries->end()) { |
| 767 if (g_dynamic_keys_offset >= g_dynamic_entries_count) | 779 if (g_dynamic_entries->size() >= g_dynamic_entries_count) |
| 768 return; | 780 return; |
| 769 entry = &(*g_custom_entries)[g_dynamic_keys_offset++]; | 781 entry = &(*g_custom_entries)[g_dynamic_keys_offset++]; |
| 770 g_dynamic_entries->insert(std::make_pair(key_string, entry)); | 782 g_dynamic_entries->insert(std::make_pair(key_string, entry)); |
| 771 } else { | 783 } else { |
| 772 entry = it->second; | 784 entry = it->second; |
| 773 } | 785 } |
| 774 | 786 |
| 775 entry->set(UTF8ToWide(key).data(), UTF8ToWide(value).data()); | 787 entry->set(UTF8ToWide(safe_key).data(), UTF8ToWide(safe_value).data()); |
| 776 } | 788 } |
| 777 | 789 |
| 778 extern "C" void __declspec(dllexport) __cdecl SetCrashKeyValuePair( | 790 extern "C" void __declspec(dllexport) __cdecl SetCrashKeyValuePair( |
| 779 const char* key, const char* value) { | 791 const char* key, const char* value) { |
| 780 SetCrashKeyValue(base::StringPiece(key), base::StringPiece(value)); | 792 SetCrashKeyValue(base::StringPiece(key), base::StringPiece(value)); |
| 781 } | 793 } |
| 782 | 794 |
| 783 void ClearCrashKeyValue(const base::StringPiece& key) { | 795 void ClearCrashKeyValue(const base::StringPiece& key) { |
| 784 DynamicEntriesMap::iterator it = g_dynamic_entries->find(key.as_string()); | 796 DynamicEntriesMap::iterator it = g_dynamic_entries->find(key.as_string()); |
| 785 if (it == g_dynamic_entries->end()) | 797 if (it == g_dynamic_entries->end()) |
| (...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1130 previous_filter = SetUnhandledExceptionFilter(filter); | 1142 previous_filter = SetUnhandledExceptionFilter(filter); |
| 1131 } | 1143 } |
| 1132 | 1144 |
| 1133 void StringVectorToCStringVector(const std::vector<std::wstring>& wstrings, | 1145 void StringVectorToCStringVector(const std::vector<std::wstring>& wstrings, |
| 1134 std::vector<const wchar_t*>* cstrings) { | 1146 std::vector<const wchar_t*>* cstrings) { |
| 1135 cstrings->clear(); | 1147 cstrings->clear(); |
| 1136 cstrings->reserve(wstrings.size()); | 1148 cstrings->reserve(wstrings.size()); |
| 1137 for (size_t i = 0; i < wstrings.size(); ++i) | 1149 for (size_t i = 0; i < wstrings.size(); ++i) |
| 1138 cstrings->push_back(wstrings[i].c_str()); | 1150 cstrings->push_back(wstrings[i].c_str()); |
| 1139 } | 1151 } |
| OLD | NEW |