diff options
Diffstat (limited to 'patch/patches/crashpad_tp_1995.patch')
-rw-r--r-- | patch/patches/crashpad_tp_1995.patch | 361 |
1 files changed, 361 insertions, 0 deletions
diff --git a/patch/patches/crashpad_tp_1995.patch b/patch/patches/crashpad_tp_1995.patch new file mode 100644 index 00000000..e06f801b --- /dev/null +++ b/patch/patches/crashpad_tp_1995.patch @@ -0,0 +1,361 @@ +diff --git third_party/crashpad/crashpad/client/prune_crash_reports.cc third_party/crashpad/crashpad/client/prune_crash_reports.cc +index 077694f541d57..928a520485414 100644 +--- third_party/crashpad/crashpad/client/prune_crash_reports.cc ++++ third_party/crashpad/crashpad/client/prune_crash_reports.cc +@@ -75,13 +75,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 b362e0aadbadd..1588232a6e4d4 100644 +--- third_party/crashpad/crashpad/client/prune_crash_reports.h ++++ third_party/crashpad/crashpad/client/prune_crash_reports.h +@@ -58,7 +58,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 5e4119e2175c7..e66600089be04 100644 +--- third_party/crashpad/crashpad/client/settings.cc ++++ third_party/crashpad/crashpad/client/settings.cc +@@ -117,7 +117,7 @@ void ScopedLockedFileHandleTraits::Free(FileHandle handle) { + + struct Settings::Data { + static constexpr uint32_t kSettingsMagic = 'CPds'; +- static constexpr uint32_t kSettingsVersion = 1; ++ static constexpr uint32_t kSettingsVersion = 2; + + enum Options : uint32_t { + kUploadsEnabled = 1 << 0, +@@ -128,6 +128,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; +@@ -135,6 +138,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; + }; + +@@ -234,6 +240,56 @@ bool Settings::IsLockExpired(const base::FilePath& file_path, + } + #endif // !CRASHPAD_FLOCK_ALWAYS_SUPPORTED + ++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( + const internal::MakeScopedLockedFileHandleOptions& options, +diff --git third_party/crashpad/crashpad/client/settings.h third_party/crashpad/crashpad/client/settings.h +index 39b2de869d225..5a4e621c650ee 100644 +--- third_party/crashpad/crashpad/client/settings.h ++++ third_party/crashpad/crashpad/client/settings.h +@@ -156,6 +156,11 @@ class Settings { + time_t lockfile_ttl); + #endif // !CRASHPAD_FLOCK_ALWAYS_SUPPORTED + ++ 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 e5d488e26c170..08d7c35b7cc5c 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") { +@@ -58,6 +59,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 = [ +@@ -73,6 +85,7 @@ static_library("handler") { + "../snapshot", + "../third_party/mini_chromium:chromeos_buildflags", + "../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 5bd2889eda975..bf3ff4bfcf5c8 100644 +--- third_party/crashpad/crashpad/handler/crash_report_upload_thread.cc ++++ third_party/crashpad/crashpad/handler/crash_report_upload_thread.cc +@@ -297,6 +297,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 22bb26e31893b..87c80604e5f7a 100644 +--- third_party/crashpad/crashpad/handler/crash_report_upload_thread.h ++++ third_party/crashpad/crashpad/handler/crash_report_upload_thread.h +@@ -16,6 +16,7 @@ + #define CRASHPAD_HANDLER_CRASH_REPORT_UPLOAD_THREAD_H_ + + #include <functional> ++#include <map> + #include <memory> + #include <string> + #include <unordered_map> +@@ -128,7 +129,7 @@ class CrashReportUploadThread : public WorkerThread::Delegate, + //! \return `true` if the thread is running, `false` if it is not. + bool is_running() const { return thread_.is_running(); } + +- private: ++ protected: + //! \brief The result code from UploadReport(). + enum class UploadResult { + //! \brief The crash report was uploaded successfully. +@@ -156,7 +157,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. + //! +@@ -170,7 +171,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. + //! +@@ -187,6 +188,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 b7ba6b14bb9b3..0567343c99325 100644 +--- third_party/crashpad/crashpad/handler/handler_main.cc ++++ third_party/crashpad/crashpad/handler/handler_main.cc +@@ -39,6 +39,7 @@ + #include "base/strings/utf_string_conversions.h" + #include "build/build_config.h" + #include "build/chromeos_buildflags.h" ++#include "cef/libcef/features/features.h" + #include "client/crash_report_database.h" + #include "client/crashpad_client.h" + #include "client/crashpad_info.h" +@@ -89,6 +90,10 @@ + #include "util/win/session_end_watcher.h" + #endif // BUILDFLAG(IS_APPLE) + ++#if BUILDFLAG(ENABLE_CEF) ++#include "cef/libcef/common/cef_crash_report_upload_thread.h" ++#endif ++ + namespace crashpad { + + namespace { +@@ -248,6 +253,9 @@ struct Options { + bool periodic_tasks; + bool rate_limit; + bool upload_gzip; ++ int max_uploads; ++ int max_database_size; ++ int max_database_age; + #if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) + bool use_cros_crash_reporter = false; + base::FilePath minidump_dir_for_tests; +@@ -622,6 +630,9 @@ int HandlerMain(int argc, + kOptionTraceParentWithException, + #endif + kOptionURL, ++ kOptionMaxUploads, ++ kOptionMaxDatabaseSize, ++ kOptionMaxDatabaseAge, + #if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) + kOptionUseCrosCrashReporter, + kOptionMinidumpDirForTests, +@@ -722,6 +733,9 @@ int HandlerMain(int argc, + #endif // BUILDFLAG(IS_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}, + }; + +@@ -879,6 +893,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 BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) + case kOptionUseCrosCrashReporter: { + options.use_cros_crash_reporter = true; +@@ -1028,11 +1063,20 @@ 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, ++ CrashReportUploadThread::ProcessPendingReportsObservationCallback(), ++ options.max_uploads)); ++#else + upload_thread.Reset(new CrashReportUploadThread( + database.get(), + options.url, + upload_thread_options, + CrashReportUploadThread::ProcessPendingReportsObservationCallback())); ++#endif + upload_thread.Get()->Start(); + } + +@@ -1103,7 +1147,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(); + } + |