| diff --git third_party/crashpad/crashpad/client/prune_crash_reports.cc third_party/crashpad/crashpad/client/prune_crash_reports.cc |
| index 8eed18d4944c..3e1fb7ac3ba5 100644 |
| --- third_party/crashpad/crashpad/client/prune_crash_reports.cc |
| +++ third_party/crashpad/crashpad/client/prune_crash_reports.cc |
| @@ -72,13 +72,19 @@ size_t PruneCrashReportDatabase(CrashReportDatabase* database, |
| } |
| |
| // static |
| -std::unique_ptr<PruneCondition> PruneCondition::GetDefault() { |
| +std::unique_ptr<PruneCondition> PruneCondition::GetDefault( |
| + int max_size_in_mb, |
| + int max_age_in_days) { |
| // DatabaseSizePruneCondition must be the LHS so that it is always evaluated, |
| // due to the short-circuting behavior of BinaryPruneCondition. |
| + if (max_size_in_mb <= 0) |
| + max_size_in_mb = 128; |
| + if (max_age_in_days <= 0) |
| + max_age_in_days = 365; |
| return std::make_unique<BinaryPruneCondition>( |
| BinaryPruneCondition::OR, |
| - new DatabaseSizePruneCondition(1024 * 128), |
| - new AgePruneCondition(365)); |
| + new DatabaseSizePruneCondition(1024 * max_size_in_mb), |
| + new AgePruneCondition(max_age_in_days)); |
| } |
| |
| static const time_t kSecondsInDay = 60 * 60 * 24; |
| diff --git third_party/crashpad/crashpad/client/prune_crash_reports.h third_party/crashpad/crashpad/client/prune_crash_reports.h |
| index 07a70980f12a..ddf7f17325fe 100644 |
| --- third_party/crashpad/crashpad/client/prune_crash_reports.h |
| +++ third_party/crashpad/crashpad/client/prune_crash_reports.h |
| @@ -59,7 +59,8 @@ class PruneCondition { |
| //! of 128 MB. |
| //! |
| //! \return A PruneCondition for use with PruneCrashReportDatabase(). |
| - static std::unique_ptr<PruneCondition> GetDefault(); |
| + static std::unique_ptr<PruneCondition> GetDefault(int max_size_in_mb, |
| + int max_age_in_days); |
| |
| virtual ~PruneCondition() {} |
| |
| diff --git third_party/crashpad/crashpad/client/settings.cc third_party/crashpad/crashpad/client/settings.cc |
| index db9dface43f8..e5bdfebf8403 100644 |
| --- third_party/crashpad/crashpad/client/settings.cc |
| +++ third_party/crashpad/crashpad/client/settings.cc |
| @@ -86,7 +86,7 @@ void ScopedLockedFileHandleTraits::Free(FileHandle handle) { |
| |
| struct Settings::Data { |
| static const uint32_t kSettingsMagic = 'CPds'; |
| - static const uint32_t kSettingsVersion = 1; |
| + static const uint32_t kSettingsVersion = 2; |
| |
| enum Options : uint32_t { |
| kUploadsEnabled = 1 << 0, |
| @@ -97,6 +97,9 @@ struct Settings::Data { |
| options(0), |
| padding_0(0), |
| last_upload_attempt_time(0), |
| + next_upload_attempt_time(0), |
| + backoff_step(0), |
| + padding_1(0), |
| client_id() {} |
| |
| uint32_t magic; |
| @@ -104,6 +107,9 @@ struct Settings::Data { |
| uint32_t options; |
| uint32_t padding_0; |
| int64_t last_upload_attempt_time; // time_t |
| + int64_t next_upload_attempt_time; // time_t |
| + uint32_t backoff_step; |
| + uint32_t padding_1; |
| UUID client_id; |
| }; |
| |
| @@ -187,6 +193,56 @@ bool Settings::SetLastUploadAttemptTime(time_t time) { |
| return WriteSettings(handle.get(), settings); |
| } |
| |
| +bool Settings::GetNextUploadAttemptTime(time_t* time) { |
| + DCHECK(initialized_.is_valid()); |
| + |
| + Data settings; |
| + if (!OpenAndReadSettings(&settings)) |
| + return false; |
| + |
| + *time = InRangeCast<time_t>(settings.next_upload_attempt_time, |
| + std::numeric_limits<time_t>::max()); |
| + return true; |
| +} |
| + |
| +bool Settings::SetNextUploadAttemptTime(time_t time) { |
| + DCHECK(initialized_.is_valid()); |
| + |
| + Data settings; |
| + ScopedLockedFileHandle handle = OpenForWritingAndReadSettings(&settings); |
| + if (!handle.is_valid()) |
| + return false; |
| + |
| + settings.next_upload_attempt_time = InRangeCast<int64_t>(time, 0); |
| + |
| + return WriteSettings(handle.get(), settings); |
| +} |
| + |
| +bool Settings::GetBackoffStep(int* step) { |
| + DCHECK(initialized_.is_valid()); |
| + |
| + Data settings; |
| + if (!OpenAndReadSettings(&settings)) |
| + return false; |
| + |
| + *step = InRangeCast<int>(settings.backoff_step, |
| + std::numeric_limits<int>::max()); |
| + return true; |
| +} |
| + |
| +bool Settings::SetBackoffStep(int step) { |
| + DCHECK(initialized_.is_valid()); |
| + |
| + Data settings; |
| + ScopedLockedFileHandle handle = OpenForWritingAndReadSettings(&settings); |
| + if (!handle.is_valid()) |
| + return false; |
| + |
| + settings.backoff_step = InRangeCast<uint32_t>(step, 0); |
| + |
| + return WriteSettings(handle.get(), settings); |
| +} |
| + |
| // static |
| Settings::ScopedLockedFileHandle Settings::MakeScopedLockedFileHandle( |
| FileHandle file, |
| diff --git third_party/crashpad/crashpad/client/settings.h third_party/crashpad/crashpad/client/settings.h |
| index 5761c6b965b5..aee4e6c96033 100644 |
| --- third_party/crashpad/crashpad/client/settings.h |
| +++ third_party/crashpad/crashpad/client/settings.h |
| @@ -115,6 +115,11 @@ class Settings { |
| //! error logged. |
| bool SetLastUploadAttemptTime(time_t time); |
| |
| + bool GetNextUploadAttemptTime(time_t* time); |
| + bool SetNextUploadAttemptTime(time_t time); |
| + bool GetBackoffStep(int* step); |
| + bool SetBackoffStep(int step); |
| + |
| private: |
| struct Data; |
| |
| diff --git third_party/crashpad/crashpad/handler/BUILD.gn third_party/crashpad/crashpad/handler/BUILD.gn |
| index ff9f5d1f2c47..c7935c4d65a7 100644 |
| --- third_party/crashpad/crashpad/handler/BUILD.gn |
| +++ third_party/crashpad/crashpad/handler/BUILD.gn |
| @@ -12,6 +12,7 @@ |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| +import("//cef/libcef/features/features.gni") |
| import("../build/crashpad_buildconfig.gni") |
| |
| static_library("handler") { |
| @@ -74,6 +75,17 @@ static_library("handler") { |
| ] |
| } |
| |
| + if (enable_cef) { |
| + sources += [ |
| + "//cef/libcef/common/cef_crash_report_upload_thread.cc", |
| + "//cef/libcef/common/cef_crash_report_upload_thread.h", |
| + "//cef/libcef/common/cef_crash_report_utils.cc", |
| + "//cef/libcef/common/cef_crash_report_utils.h", |
| + ] |
| + |
| + configs += [ "//cef/libcef/features:config" ] |
| + } |
| + |
| public_configs = [ "..:crashpad_config" ] |
| |
| public_deps = [ |
| @@ -86,6 +98,7 @@ static_library("handler") { |
| "../minidump", |
| "../snapshot", |
| "../tools:tool_support", |
| + "//cef/libcef/features", |
| ] |
| |
| if (crashpad_is_win) { |
| diff --git third_party/crashpad/crashpad/handler/crash_report_upload_thread.cc third_party/crashpad/crashpad/handler/crash_report_upload_thread.cc |
| index e144bddc67d1..f3d727d0b247 100644 |
| --- third_party/crashpad/crashpad/handler/crash_report_upload_thread.cc |
| +++ third_party/crashpad/crashpad/handler/crash_report_upload_thread.cc |
| @@ -262,6 +262,8 @@ CrashReportUploadThread::UploadResult CrashReportUploadThread::UploadReport( |
| if (minidump_process_snapshot.Initialize(reader)) { |
| parameters = |
| BreakpadHTTPFormParametersFromMinidump(&minidump_process_snapshot); |
| + if (!parameters.empty()) |
| + parameters = FilterParameters(parameters); |
| } |
| |
| if (!reader->SeekSet(start_offset)) { |
| diff --git third_party/crashpad/crashpad/handler/crash_report_upload_thread.h third_party/crashpad/crashpad/handler/crash_report_upload_thread.h |
| index 2ec1147d2620..8ff9a72e0bd7 100644 |
| --- third_party/crashpad/crashpad/handler/crash_report_upload_thread.h |
| +++ third_party/crashpad/crashpad/handler/crash_report_upload_thread.h |
| @@ -15,6 +15,7 @@ |
| #ifndef CRASHPAD_HANDLER_CRASH_REPORT_UPLOAD_THREAD_H_ |
| #define CRASHPAD_HANDLER_CRASH_REPORT_UPLOAD_THREAD_H_ |
| |
| +#include <map> |
| #include <memory> |
| #include <string> |
| |
| @@ -103,7 +104,7 @@ class CrashReportUploadThread : public WorkerThread::Delegate, |
| //! It is expected to only be called from the same thread that called Start(). |
| void Stop() override; |
| |
| - private: |
| + protected: |
| //! \brief The result code from UploadReport(). |
| enum class UploadResult { |
| //! \brief The crash report was uploaded successfully. |
| @@ -131,7 +132,7 @@ class CrashReportUploadThread : public WorkerThread::Delegate, |
| //! object was constructed with \a watch_pending_reports, it will also scan |
| //! the crash report database for other pending reports, and process those as |
| //! well. |
| - void ProcessPendingReports(); |
| + virtual void ProcessPendingReports(); |
| |
| //! \brief Processes a single pending report from the database. |
| //! |
| @@ -145,7 +146,7 @@ class CrashReportUploadThread : public WorkerThread::Delegate, |
| //! remain in the “pending” state. If the upload fails and no more retries are |
| //! desired, or report upload is disabled, it will be marked as “completed” in |
| //! the database without ever having been uploaded. |
| - void ProcessPendingReport(const CrashReportDatabase::Report& report); |
| + virtual void ProcessPendingReport(const CrashReportDatabase::Report& report); |
| |
| //! \brief Attempts to upload a crash report. |
| //! |
| @@ -162,6 +163,11 @@ class CrashReportUploadThread : public WorkerThread::Delegate, |
| UploadResult UploadReport(const CrashReportDatabase::UploadReport* report, |
| std::string* response_body); |
| |
| + using ParameterMap = std::map<std::string, std::string>; |
| + virtual ParameterMap FilterParameters(const ParameterMap& parameters) { |
| + return parameters; |
| + } |
| + |
| // WorkerThread::Delegate: |
| //! \brief Calls ProcessPendingReports() in response to ReportPending() having |
| //! been called on any thread, as well as periodically on a timer. |
| diff --git third_party/crashpad/crashpad/handler/handler_main.cc third_party/crashpad/crashpad/handler/handler_main.cc |
| index e0a262cd1f38..2949e3ac1739 100644 |
| --- third_party/crashpad/crashpad/handler/handler_main.cc |
| +++ third_party/crashpad/crashpad/handler/handler_main.cc |
| @@ -36,8 +36,10 @@ |
| #include "base/scoped_generic.h" |
| #include "base/strings/string_number_conversions.h" |
| #include "base/strings/stringprintf.h" |
| +#include "base/strings/string_number_conversions.h" |
| #include "base/strings/utf_string_conversions.h" |
| #include "build/build_config.h" |
| +#include "cef/libcef/features/features.h" |
| #include "client/crash_report_database.h" |
| #include "client/crashpad_client.h" |
| #include "client/crashpad_info.h" |
| @@ -100,6 +102,10 @@ |
| #include "handler/linux/exception_handler_server.h" |
| #endif // OS_MACOSX |
| |
| +#if BUILDFLAG(ENABLE_CEF) |
| +#include "cef/libcef/common/cef_crash_report_upload_thread.h" |
| +#endif |
| + |
| namespace crashpad { |
| |
| namespace { |
| @@ -215,6 +221,9 @@ struct Options { |
| bool periodic_tasks; |
| bool rate_limit; |
| bool upload_gzip; |
| + int max_uploads; |
| + int max_database_size; |
| + int max_database_age; |
| #if defined(OS_CHROMEOS) |
| bool use_cros_crash_reporter = false; |
| base::FilePath minidump_dir_for_tests; |
| @@ -577,6 +586,9 @@ int HandlerMain(int argc, |
| kOptionTraceParentWithException, |
| #endif |
| kOptionURL, |
| + kOptionMaxUploads, |
| + kOptionMaxDatabaseSize, |
| + kOptionMaxDatabaseAge, |
| #if defined(OS_CHROMEOS) |
| kOptionUseCrosCrashReporter, |
| kOptionMinidumpDirForTests, |
| @@ -675,6 +687,9 @@ int HandlerMain(int argc, |
| #endif // OS_ANDROID |
| {"help", no_argument, nullptr, kOptionHelp}, |
| {"version", no_argument, nullptr, kOptionVersion}, |
| + {"max-uploads", required_argument, nullptr, kOptionMaxUploads}, |
| + {"max-db-size", required_argument, nullptr, kOptionMaxDatabaseSize}, |
| + {"max-db-age", required_argument, nullptr, kOptionMaxDatabaseAge}, |
| {nullptr, 0, nullptr, 0}, |
| }; |
| |
| @@ -823,6 +838,27 @@ int HandlerMain(int argc, |
| options.url = optarg; |
| break; |
| } |
| + case kOptionMaxUploads: { |
| + if (base::StringToInt(optarg, &options.max_uploads)) { |
| + if (options.max_uploads < 0) |
| + options.max_uploads = 0; |
| + } |
| + break; |
| + } |
| + case kOptionMaxDatabaseSize: { |
| + if (base::StringToInt(optarg, &options.max_database_size)) { |
| + if (options.max_database_size < 0) |
| + options.max_database_size = 0; |
| + } |
| + break; |
| + } |
| + case kOptionMaxDatabaseAge: { |
| + if (base::StringToInt(optarg, &options.max_database_age)) { |
| + if (options.max_database_age < 0) |
| + options.max_database_age = 0; |
| + } |
| + break; |
| + } |
| #if defined(OS_CHROMEOS) |
| case kOptionUseCrosCrashReporter: { |
| options.use_cros_crash_reporter = true; |
| @@ -972,8 +1008,14 @@ int HandlerMain(int argc, |
| upload_thread_options.upload_gzip = options.upload_gzip; |
| upload_thread_options.watch_pending_reports = options.periodic_tasks; |
| |
| +#if BUILDFLAG(ENABLE_CEF) |
| + upload_thread.Reset(new CefCrashReportUploadThread( |
| + database.get(), options.url, upload_thread_options, |
| + options.max_uploads)); |
| +#else |
| upload_thread.Reset(new CrashReportUploadThread( |
| database.get(), options.url, upload_thread_options)); |
| +#endif |
| upload_thread.Get()->Start(); |
| } |
| |
| @@ -1043,7 +1085,8 @@ int HandlerMain(int argc, |
| ScopedStoppable prune_thread; |
| if (options.periodic_tasks) { |
| prune_thread.Reset(new PruneCrashReportThread( |
| - database.get(), PruneCondition::GetDefault())); |
| + database.get(), PruneCondition::GetDefault(options.max_database_size, |
| + options.max_database_age))); |
| prune_thread.Get()->Start(); |
| } |
| |