Move off std::sto* function which abort on failure.
Bug: http://b/31403370
Test: builds, boots, libbase tests pass
Change-Id: I89cd7ca3d8f1c8a1bad0ddf3043439449d19a293
diff --git a/init/builtins.cpp b/init/builtins.cpp
index f4ba018..da4b84e 100644
--- a/init/builtins.cpp
+++ b/init/builtins.cpp
@@ -304,7 +304,7 @@
/* mkdir <path> [mode] [owner] [group] */
if (args.size() >= 3) {
- mode = std::stoul(args[2], 0, 8);
+ mode = std::strtoul(args[2].c_str(), 0, 8);
}
ret = make_dir(args[1].c_str(), mode);
@@ -637,10 +637,13 @@
static int do_setrlimit(const std::vector<std::string>& args) {
struct rlimit limit;
int resource;
- resource = std::stoi(args[1]);
- limit.rlim_cur = std::stoi(args[2]);
- limit.rlim_max = std::stoi(args[3]);
- return setrlimit(resource, &limit);
+ if (android::base::ParseInt(args[1], &resource) &&
+ android::base::ParseUint(args[2], &limit.rlim_cur) &&
+ android::base::ParseUint(args[3], &limit.rlim_max)) {
+ return setrlimit(resource, &limit);
+ }
+ LOG(WARNING) << "ignoring setrlimit " << args[1] << " " << args[2] << " " << args[3];
+ return -1;
}
static int do_start(const std::vector<std::string>& args) {
@@ -709,7 +712,7 @@
std::string timeout = property_get("ro.build.shutdown_timeout");
unsigned int delay = 0;
- if (android::base::ParseUint(timeout.c_str(), &delay) && delay > 0) {
+ if (android::base::ParseUint(timeout, &delay) && delay > 0) {
Timer t;
// Ask all services to terminate.
ServiceManager::GetInstance().ForEachService(
@@ -764,13 +767,11 @@
}
static int do_sysclktz(const std::vector<std::string>& args) {
- struct timezone tz;
-
- memset(&tz, 0, sizeof(tz));
- tz.tz_minuteswest = std::stoi(args[1]);
- if (settimeofday(NULL, &tz))
- return -1;
- return 0;
+ struct timezone tz = {};
+ if (android::base::ParseInt(args[1], &tz.tz_minuteswest) && settimeofday(NULL, &tz) != -1) {
+ return 0;
+ }
+ return -1;
}
static int do_verity_load_state(const std::vector<std::string>& args) {
@@ -914,7 +915,8 @@
static int do_loglevel(const std::vector<std::string>& args) {
// TODO: support names instead/as well?
- int log_level = std::stoi(args[1]);
+ int log_level = -1;
+ android::base::ParseInt(args[1], &log_level);
android::base::LogSeverity severity;
switch (log_level) {
case 7: severity = android::base::DEBUG; break;
@@ -947,9 +949,12 @@
if (args.size() == 2) {
return wait_for_file(args[1].c_str(), COMMAND_RETRY_TIMEOUT);
} else if (args.size() == 3) {
- return wait_for_file(args[1].c_str(), std::stoi(args[2]));
- } else
- return -1;
+ int timeout;
+ if (android::base::ParseInt(args[2], &timeout)) {
+ return wait_for_file(args[1].c_str(), timeout);
+ }
+ }
+ return -1;
}
/*
diff --git a/init/service.cpp b/init/service.cpp
index 503d84f..22fb013 100644
--- a/init/service.cpp
+++ b/init/service.cpp
@@ -31,6 +31,7 @@
#include <selinux/selinux.h>
#include <android-base/file.h>
+#include <android-base/parseint.h>
#include <android-base/stringprintf.h>
#include <android-base/strings.h>
#include <cutils/android_reboot.h>
@@ -46,6 +47,7 @@
#include "property_service.h"
#include "util.h"
+using android::base::ParseInt;
using android::base::StringPrintf;
using android::base::WriteStringToFile;
@@ -351,22 +353,19 @@
}
bool Service::ParsePriority(const std::vector<std::string>& args, std::string* err) {
- priority_ = std::stoi(args[1]);
-
- if (priority_ < ANDROID_PRIORITY_HIGHEST || priority_ > ANDROID_PRIORITY_LOWEST) {
- priority_ = 0;
+ priority_ = 0;
+ if (!ParseInt(args[1], &priority_,
+ static_cast<int>(ANDROID_PRIORITY_LOWEST),
+ static_cast<int>(ANDROID_PRIORITY_HIGHEST))) {
*err = StringPrintf("process priority value must be range %d - %d",
ANDROID_PRIORITY_HIGHEST, ANDROID_PRIORITY_LOWEST);
return false;
}
-
return true;
}
bool Service::ParseIoprio(const std::vector<std::string>& args, std::string* err) {
- ioprio_pri_ = std::stoul(args[2], 0, 8);
-
- if (ioprio_pri_ < 0 || ioprio_pri_ > 7) {
+ if (!ParseInt(args[2], &ioprio_pri_, 0, 7)) {
*err = "priority value must be range 0 - 7";
return false;
}
@@ -387,7 +386,12 @@
bool Service::ParseKeycodes(const std::vector<std::string>& args, std::string* err) {
for (std::size_t i = 1; i < args.size(); i++) {
- keycodes_.emplace_back(std::stoi(args[i]));
+ int code;
+ if (ParseInt(args[i], &code)) {
+ keycodes_.emplace_back(code);
+ } else {
+ LOG(WARNING) << "ignoring invalid keycode: " << args[i];
+ }
}
return true;
}
@@ -420,17 +424,13 @@
}
bool Service::ParseOomScoreAdjust(const std::vector<std::string>& args, std::string* err) {
- oom_score_adjust_ = std::stol(args[1], 0, 10);
-
- if (oom_score_adjust_ < -1000 || oom_score_adjust_ > 1000) {
+ if (!ParseInt(args[1], &oom_score_adjust_, -1000, 1000)) {
*err = "oom_score_adjust value must be in range -1000 - +1000";
return false;
}
-
return true;
}
-
bool Service::ParseSeclabel(const std::vector<std::string>& args, std::string* err) {
seclabel_ = args[1];
return true;
@@ -448,7 +448,7 @@
return false;
}
- int perm = std::stoul(args[3], 0, 8);
+ int perm = std::strtoul(args[3].c_str(), 0, 8);
uid_t uid = args.size() > 4 ? decode_uid(args[4].c_str()) : 0;
gid_t gid = args.size() > 5 ? decode_uid(args[5].c_str()) : 0;
std::string socketcon = args.size() > 6 ? args[6] : "";