Merge "Properly fail userspace reboot if it's not supported"

This commit is contained in:
Nikita Ioffe 2020-04-02 10:23:45 +00:00 committed by Gerrit Code Review
commit 2af5bd00b0
2 changed files with 22 additions and 0 deletions

View File

@ -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

View File

@ -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