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

Commit a4761a97 authored by Nikita Ioffe's avatar Nikita Ioffe Committed by Automerger Merge Worker
Browse files

Merge "Properly fail userspace reboot if it's not supported" am: 2af5bd00 am: 62a02cc8

Change-Id: I0fbc4b26b5b8ea30f46dcad0d4ebc772bda3c27e
parents d1d22f15 62a02cc8
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -47,6 +47,7 @@
#include <thread>
#include <vector>

#include <InitProperties.sysprop.h>
#include <android-base/chrono_utils.h>
#include <android-base/file.h>
#include <android-base/logging.h>
@@ -85,6 +86,7 @@ using android::properties::BuildTrie;
using android::properties::ParsePropertyInfoFile;
using android::properties::PropertyInfoAreaFile;
using android::properties::PropertyInfoEntry;
using android::sysprop::InitProperties::is_userspace_reboot_supported;

namespace android {
namespace init {
@@ -492,6 +494,10 @@ uint32_t HandlePropertySet(const std::string& name, const std::string& value,
        if (!value.empty()) {
            DebugRebootLogging();
        }
        if (value == "reboot,userspace" && !is_userspace_reboot_supported().value_or(false)) {
            *error = "Userspace reboot is not supported by this device";
            return PROP_ERROR_INVALID_VALUE;
        }
    }

    // If a process other than init is writing a non-empty value, it means that process is
+16 −0
Original line number Diff line number Diff line
@@ -22,8 +22,10 @@
#include <sys/_system_properties.h>

#include <android-base/properties.h>
#include <android-base/scopeguard.h>
#include <gtest/gtest.h>

using android::base::GetProperty;
using android::base::SetProperty;

namespace android {
@@ -74,5 +76,19 @@ TEST(property_service, non_utf8_value) {
    EXPECT_TRUE(SetProperty("property_service_utf8_test", "\xF0\x90\x80\x80"));
}

TEST(property_service, userspace_reboot_not_supported) {
    if (getuid() != 0) {
        GTEST_SKIP() << "Skipping test, must be run as root.";
        return;
    }
    const std::string original_value = GetProperty("init.userspace_reboot.is_supported", "");
    auto guard = android::base::make_scope_guard([&original_value]() {
        SetProperty("init.userspace_reboot.is_supported", original_value);
    });

    ASSERT_TRUE(SetProperty("init.userspace_reboot.is_supported", "false"));
    EXPECT_FALSE(SetProperty("sys.powerctl", "reboot,userspace"));
}

}  // namespace init
}  // namespace android