remount: Auto remount option (-R) also tries to gain root

When doing an auto remount & reboot command and is running as the SHELL
uid, just try to gain root on behalf of the user and retry the remount
command.
If "gain root" failed, then print the message to tell the user to run
"adb root" and retry.

Bug: 322285923
Test: adb unroot && adb remount -vR
Test: adb unroot && adb shell remount -vR
Change-Id: If8e04dc602573c73178c108ef4944f0a985b590e
This commit is contained in:
Yi-Yo Chiang 2024-01-25 17:24:31 +08:00
parent 761db93167
commit bbb9690935

View file

@ -42,6 +42,7 @@
#include <fstab/fstab.h>
#include <libavb_user/libavb_user.h>
#include <libgsi/libgsid.h>
#include <private/android_filesystem_config.h>
#include "fs_mgr_overlayfs_control.h"
#include "fs_mgr_overlayfs_mount.h"
@ -608,7 +609,19 @@ int main(int argc, char* argv[]) {
}
// Make sure we are root.
if (::getuid() != 0) {
if (const auto uid = ::getuid(); uid != AID_ROOT) {
// If requesting auto reboot, also try to auto gain root.
if (auto_reboot && uid == AID_SHELL && access("/system/xbin/su", F_OK) == 0) {
std::vector<char*> args{const_cast<char*>("/system/xbin/su"),
const_cast<char*>("root")};
for (int i = 0; i < argc; ++i) {
args.push_back(argv[i]);
}
args.push_back(nullptr);
LOG(INFO) << "Attempting to gain root with \"su root\"";
execv(args[0], args.data());
PLOG(ERROR) << "Failed to execute \"su root\"";
}
LOG(ERROR) << "Not running as root. Try \"adb root\" first.";
return EXIT_FAILURE;
}