Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 37a32604 authored by Andreas Gampe's avatar Andreas Gampe Committed by android-build-merger
Browse files

Otapreopt: Try to mount vendor partition for A/B OTA

am: fd12edae

Change-Id: Ifefe8e127828fdd9aa023e5b81706cb6b2d02e11
parents 8c839de8 fd12edae
Loading
Loading
Loading
Loading
+2 −4
Original line number Diff line number Diff line
@@ -44,6 +44,7 @@

#include <globals.h>
#include <installd_deps.h>
#include <otapreopt_utils.h>
#include <utils.h>

#ifndef LOG_TAG
@@ -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;
        }
+4 −7
Original line number Diff line number Diff line
@@ -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>

@@ -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) {
+23 −0
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@
#include <android-base/stringprintf.h>

#include <commands.h>
#include <otapreopt_utils.h>

#ifndef LOG_TAG
#define LOG_TAG "otapreopt"
@@ -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.";
+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_