Loading cmds/installd/commands.cpp +2 −4 Original line number Diff line number Diff line Loading @@ -44,6 +44,7 @@ #include <globals.h> #include <installd_deps.h> #include <otapreopt_utils.h> #include <utils.h> #ifndef LOG_TAG Loading Loading @@ -2124,10 +2125,7 @@ int move_ab(const char* apk_path, const char* instruction_set, const char* oat_d } slot_suffix = buf; // Validate. std::regex slot_suffix_regex("[a-zA-Z0-9_]+"); std::smatch slot_suffix_match; if (!std::regex_match(slot_suffix, slot_suffix_match, slot_suffix_regex)) { if (!ValidateTargetSlotSuffix(slot_suffix)) { LOG(ERROR) << "Target slot suffix not legal: " << slot_suffix; return -1; } Loading cmds/installd/otapreopt.cpp +4 −7 Original line number Diff line number Diff line Loading @@ -40,6 +40,7 @@ #include <file_parsing.h> #include <globals.h> #include <installd_deps.h> // Need to fill in requirements of commands. #include <otapreopt_utils.h> #include <system_properties.h> #include <utils.h> Loading Loading @@ -261,14 +262,10 @@ private: } // Sanitize value. Only allow (a-zA-Z0-9_)+. target_slot_ = target_slot_arg; { std::regex slot_suffix_regex("[a-zA-Z0-9_]+"); std::smatch slot_suffix_match; if (!std::regex_match(target_slot_, slot_suffix_match, slot_suffix_regex)) { if (!ValidateTargetSlotSuffix(target_slot_)) { LOG(ERROR) << "Target slot suffix not legal: " << target_slot_; return false; } } // Check for "dexopt" next. if (argv[2] == nullptr) { Loading cmds/installd/otapreopt_chroot.cpp +23 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ #include <android-base/stringprintf.h> #include <commands.h> #include <otapreopt_utils.h> #ifndef LOG_TAG #define LOG_TAG "otapreopt" Loading Loading @@ -94,6 +95,28 @@ static int otapreopt_chroot(const int argc, char **arg) { } } // Try to mount the vendor partition. update_engine doesn't do this for us, but we // want it for vendor APKs. // Notes: // 1) We pretty much guess a name here and hope to find the partition by name. // It is just as complicated and brittle to scan /proc/mounts. But this requires // validating the target-slot so as not to try to mount some totally random path. // 2) We're in a mount namespace here, so when we die, this will be cleaned up. // 3) Ignore errors. Printing anything at this stage will open a file descriptor // for logging. if (!ValidateTargetSlotSuffix(arg[2])) { LOG(ERROR) << "Target slot suffix not legal: " << arg[2]; exit(207); } std::string vendor_partition = StringPrintf("/dev/block/bootdevice/by-name/vendor%s", arg[2]); int vendor_result = mount(vendor_partition.c_str(), "/postinstall/vendor", "ext4", MS_RDONLY, /* data */ nullptr); UNUSED(vendor_result); // Chdir into /postinstall. if (chdir("/postinstall") != 0) { PLOG(ERROR) << "Unable to chdir into /postinstall."; Loading cmds/installd/otapreopt_utils.h 0 → 100644 +34 −0 Original line number Diff line number Diff line /* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef OTAPREOPT_UTILS_H_ #define OTAPREOPT_UTILS_H_ #include <regex> namespace android { namespace installd { static inline bool ValidateTargetSlotSuffix(const std::string& input) { std::regex slot_suffix_regex("[a-zA-Z0-9_]+"); std::smatch slot_suffix_match; return std::regex_match(input, slot_suffix_match, slot_suffix_regex); } } // namespace installd } // namespace android #endif // OTAPREOPT_UTILS_H_ Loading
cmds/installd/commands.cpp +2 −4 Original line number Diff line number Diff line Loading @@ -44,6 +44,7 @@ #include <globals.h> #include <installd_deps.h> #include <otapreopt_utils.h> #include <utils.h> #ifndef LOG_TAG Loading Loading @@ -2124,10 +2125,7 @@ int move_ab(const char* apk_path, const char* instruction_set, const char* oat_d } slot_suffix = buf; // Validate. std::regex slot_suffix_regex("[a-zA-Z0-9_]+"); std::smatch slot_suffix_match; if (!std::regex_match(slot_suffix, slot_suffix_match, slot_suffix_regex)) { if (!ValidateTargetSlotSuffix(slot_suffix)) { LOG(ERROR) << "Target slot suffix not legal: " << slot_suffix; return -1; } Loading
cmds/installd/otapreopt.cpp +4 −7 Original line number Diff line number Diff line Loading @@ -40,6 +40,7 @@ #include <file_parsing.h> #include <globals.h> #include <installd_deps.h> // Need to fill in requirements of commands. #include <otapreopt_utils.h> #include <system_properties.h> #include <utils.h> Loading Loading @@ -261,14 +262,10 @@ private: } // Sanitize value. Only allow (a-zA-Z0-9_)+. target_slot_ = target_slot_arg; { std::regex slot_suffix_regex("[a-zA-Z0-9_]+"); std::smatch slot_suffix_match; if (!std::regex_match(target_slot_, slot_suffix_match, slot_suffix_regex)) { if (!ValidateTargetSlotSuffix(target_slot_)) { LOG(ERROR) << "Target slot suffix not legal: " << target_slot_; return false; } } // Check for "dexopt" next. if (argv[2] == nullptr) { Loading
cmds/installd/otapreopt_chroot.cpp +23 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ #include <android-base/stringprintf.h> #include <commands.h> #include <otapreopt_utils.h> #ifndef LOG_TAG #define LOG_TAG "otapreopt" Loading Loading @@ -94,6 +95,28 @@ static int otapreopt_chroot(const int argc, char **arg) { } } // Try to mount the vendor partition. update_engine doesn't do this for us, but we // want it for vendor APKs. // Notes: // 1) We pretty much guess a name here and hope to find the partition by name. // It is just as complicated and brittle to scan /proc/mounts. But this requires // validating the target-slot so as not to try to mount some totally random path. // 2) We're in a mount namespace here, so when we die, this will be cleaned up. // 3) Ignore errors. Printing anything at this stage will open a file descriptor // for logging. if (!ValidateTargetSlotSuffix(arg[2])) { LOG(ERROR) << "Target slot suffix not legal: " << arg[2]; exit(207); } std::string vendor_partition = StringPrintf("/dev/block/bootdevice/by-name/vendor%s", arg[2]); int vendor_result = mount(vendor_partition.c_str(), "/postinstall/vendor", "ext4", MS_RDONLY, /* data */ nullptr); UNUSED(vendor_result); // Chdir into /postinstall. if (chdir("/postinstall") != 0) { PLOG(ERROR) << "Unable to chdir into /postinstall."; Loading
cmds/installd/otapreopt_utils.h 0 → 100644 +34 −0 Original line number Diff line number Diff line /* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef OTAPREOPT_UTILS_H_ #define OTAPREOPT_UTILS_H_ #include <regex> namespace android { namespace installd { static inline bool ValidateTargetSlotSuffix(const std::string& input) { std::regex slot_suffix_regex("[a-zA-Z0-9_]+"); std::smatch slot_suffix_match; return std::regex_match(input, slot_suffix_match, slot_suffix_regex); } } // namespace installd } // namespace android #endif // OTAPREOPT_UTILS_H_