diff --git a/bootstat/boot_event_record_store.cpp b/bootstat/boot_event_record_store.cpp index ef4f68ec0..346eadae6 100644 --- a/bootstat/boot_event_record_store.cpp +++ b/bootstat/boot_event_record_store.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include "histogram_logger.h" #include "uptime_parser.h" @@ -57,8 +58,10 @@ bool ParseRecordEventTime(const std::string& path, int32_t* uptime) { // Ignore existing bootstat records (which do not contain file content). if (!content.empty()) { - int32_t value = std::stoi(content); - bootstat::LogHistogram("bootstat_mtime_matches_content", value == *uptime); + int32_t value; + if (android::base::ParseInt(content.c_str(), &value)) { + bootstat::LogHistogram("bootstat_mtime_matches_content", value == *uptime); + } } return true; diff --git a/bootstat/bootstat.cpp b/bootstat/bootstat.cpp index 7c1b7f38d..71a5a3993 100644 --- a/bootstat/bootstat.cpp +++ b/bootstat/bootstat.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include "boot_event_record_store.h" @@ -56,8 +57,9 @@ void RecordBootEventFromCommandLine( BootEventRecordStore boot_event_store; if (!value_str.empty()) { int32_t value = 0; - value = std::stoi(value_str); - boot_event_store.AddBootEventWithValue(event, value); + if (android::base::ParseInt(value_str.c_str(), &value)) { + boot_event_store.AddBootEventWithValue(event, value); + } } else { boot_event_store.AddBootEvent(event); } @@ -187,7 +189,10 @@ std::string CalculateBootCompletePrefix() { std::string boot_complete_prefix = "boot_complete"; std::string build_date_str = GetProperty("ro.build.date.utc"); - int32_t build_date = std::stoi(build_date_str); + int32_t build_date; + if (!android::base::ParseInt(build_date_str.c_str(), &build_date)) { + return std::string(); + } BootEventRecordStore boot_event_store; BootEventRecordStore::BootEventRecord record; @@ -223,6 +228,10 @@ void RecordBootComplete() { // ota_boot_complete. The latter signifies that the device is booting after // a system update. std::string boot_complete_prefix = CalculateBootCompletePrefix(); + if (boot_complete_prefix.empty()) { + // The system is hosed because the build date property could not be read. + return; + } // post_decrypt_time_elapsed is only logged on encrypted devices. if (boot_event_store.GetBootEvent("post_decrypt_time_elapsed", &record)) {