mirror of
				https://bitbucket.org/chromiumembedded/cef
				synced 2025-06-05 21:39:12 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			360 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			360 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| diff --git third_party/crashpad/crashpad/client/prune_crash_reports.cc third_party/crashpad/crashpad/client/prune_crash_reports.cc
 | |
| index 927ed6010f36e..1a36ae5d41d1f 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 76d77c86072d5..9cb6be87eb46f 100644
 | |
| --- third_party/crashpad/crashpad/client/settings.cc
 | |
| +++ third_party/crashpad/crashpad/client/settings.cc
 | |
| @@ -122,7 +122,7 @@ struct Settings::Data {
 | |
|    // Version number only used for incompatible changes to Data. Do not change
 | |
|    // this when adding additional fields at the end. Modifying `kSettingsVersion`
 | |
|    // will wipe away the entire struct when reading from other versions.
 | |
| -  static constexpr uint32_t kSettingsVersion = 1;
 | |
| +  static constexpr uint32_t kSettingsVersion = 2;
 | |
|  
 | |
|    enum Options : uint32_t {
 | |
|      kUploadsEnabled = 1 << 0,
 | |
| @@ -133,6 +133,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;
 | |
| @@ -140,6 +143,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;
 | |
|  };
 | |
|  
 | |
| @@ -239,6 +245,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 104e8502908e2..9086d7b9e00fd 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") {
 | |
| @@ -76,11 +77,23 @@ static_library("handler") {
 | |
|      "../snapshot",
 | |
|      "../third_party/mini_chromium:chromeos_buildflags",
 | |
|      "../tools:tool_support",
 | |
| +    "//cef/libcef/features:buildflags",
 | |
|    ]
 | |
|  
 | |
|    if (crashpad_is_win) {
 | |
|      cflags = [ "/wd4201" ]  # nonstandard extension used : nameless struct/union
 | |
|    }
 | |
| +
 | |
| +  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" ]
 | |
| +  }
 | |
|  }
 | |
|  
 | |
|  if (crashpad_is_android) {
 | |
| diff --git third_party/crashpad/crashpad/handler/crash_report_upload_thread.cc third_party/crashpad/crashpad/handler/crash_report_upload_thread.cc
 | |
| index 8350d0761ac18..9fc26214c4c0a 100644
 | |
| --- third_party/crashpad/crashpad/handler/crash_report_upload_thread.cc
 | |
| +++ third_party/crashpad/crashpad/handler/crash_report_upload_thread.cc
 | |
| @@ -296,6 +296,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 7e908c0a305be..e35414a131f07 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();
 | |
|    }
 | |
|  
 |