Loading adb/remount_service.cpp +18 −29 Original line number Diff line number Diff line Loading @@ -34,10 +34,6 @@ #include "adb_utils.h" #include "cutils/properties.h" static int system_ro = 1; static int vendor_ro = 1; static int oem_ro = 1; // Returns the device used to mount a directory in /proc/mounts. static std::string find_mount(const char* dir) { std::unique_ptr<FILE, int(*)(FILE*)> fp(setmntent("/proc/mounts", "r"), endmntent); Loading @@ -54,40 +50,33 @@ static std::string find_mount(const char* dir) { return ""; } int make_block_device_writable(const std::string& dev) { bool make_block_device_writable(const std::string& dev) { int fd = unix_open(dev.c_str(), O_RDONLY | O_CLOEXEC); if (fd == -1) { return -1; return false; } int result = -1; int OFF = 0; if (!ioctl(fd, BLKROSET, &OFF)) { result = 0; } bool result = (ioctl(fd, BLKROSET, &OFF) != -1); adb_close(fd); return result; } // Init mounts /system as read only, remount to enable writes. static int remount(const char* dir, int* dir_ro) { std::string dev = find_mount(dir); if (dev.empty() || make_block_device_writable(dev)) { return -1; } int rc = mount(dev.c_str(), dir, "none", MS_REMOUNT, NULL); *dir_ro = rc; return rc; static bool remount_partition(int fd, const char* dir) { if (!directory_exists(dir)) { return true; } static bool remount_partition(int fd, const char* partition, int* ro) { if (!directory_exists(partition)) { std::string dev = find_mount(dir); if (dev.empty()) { return true; } if (remount(partition, ro)) { WriteFdFmt(fd, "remount of %s failed: %s\n", partition, strerror(errno)); if (!make_block_device_writable(dev)) { WriteFdFmt(fd, "remount of %s failed; couldn't make block device %s writable: %s\n", dir, dev.c_str(), strerror(errno)); return false; } if (mount(dev.c_str(), dir, "none", MS_REMOUNT, nullptr) == -1) { WriteFdFmt(fd, "remount of %s failed: %s\n", dir, strerror(errno)); return false; } return true; Loading Loading @@ -123,9 +112,9 @@ void remount_service(int fd, void* cookie) { } bool success = true; success &= remount_partition(fd, "/system", &system_ro); success &= remount_partition(fd, "/vendor", &vendor_ro); success &= remount_partition(fd, "/oem", &oem_ro); success &= remount_partition(fd, "/system"); success &= remount_partition(fd, "/vendor"); success &= remount_partition(fd, "/oem"); WriteFdExactly(fd, success ? "remount succeeded\n" : "remount failed\n"); Loading adb/remount_service.h +1 −1 Original line number Diff line number Diff line Loading @@ -19,7 +19,7 @@ #include <string> int make_block_device_writable(const std::string&); bool make_block_device_writable(const std::string&); void remount_service(int, void*); #endif adb/set_verity_enable_state_service.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -86,7 +86,7 @@ static int set_verity_enabled_state(int fd, const char *block_device, int device = -1; int retval = -1; if (make_block_device_writable(block_device)) { if (!make_block_device_writable(block_device)) { WriteFdFmt(fd, "Could not make block device %s writable (%s).\n", block_device, strerror(errno)); goto errout; Loading Loading
adb/remount_service.cpp +18 −29 Original line number Diff line number Diff line Loading @@ -34,10 +34,6 @@ #include "adb_utils.h" #include "cutils/properties.h" static int system_ro = 1; static int vendor_ro = 1; static int oem_ro = 1; // Returns the device used to mount a directory in /proc/mounts. static std::string find_mount(const char* dir) { std::unique_ptr<FILE, int(*)(FILE*)> fp(setmntent("/proc/mounts", "r"), endmntent); Loading @@ -54,40 +50,33 @@ static std::string find_mount(const char* dir) { return ""; } int make_block_device_writable(const std::string& dev) { bool make_block_device_writable(const std::string& dev) { int fd = unix_open(dev.c_str(), O_RDONLY | O_CLOEXEC); if (fd == -1) { return -1; return false; } int result = -1; int OFF = 0; if (!ioctl(fd, BLKROSET, &OFF)) { result = 0; } bool result = (ioctl(fd, BLKROSET, &OFF) != -1); adb_close(fd); return result; } // Init mounts /system as read only, remount to enable writes. static int remount(const char* dir, int* dir_ro) { std::string dev = find_mount(dir); if (dev.empty() || make_block_device_writable(dev)) { return -1; } int rc = mount(dev.c_str(), dir, "none", MS_REMOUNT, NULL); *dir_ro = rc; return rc; static bool remount_partition(int fd, const char* dir) { if (!directory_exists(dir)) { return true; } static bool remount_partition(int fd, const char* partition, int* ro) { if (!directory_exists(partition)) { std::string dev = find_mount(dir); if (dev.empty()) { return true; } if (remount(partition, ro)) { WriteFdFmt(fd, "remount of %s failed: %s\n", partition, strerror(errno)); if (!make_block_device_writable(dev)) { WriteFdFmt(fd, "remount of %s failed; couldn't make block device %s writable: %s\n", dir, dev.c_str(), strerror(errno)); return false; } if (mount(dev.c_str(), dir, "none", MS_REMOUNT, nullptr) == -1) { WriteFdFmt(fd, "remount of %s failed: %s\n", dir, strerror(errno)); return false; } return true; Loading Loading @@ -123,9 +112,9 @@ void remount_service(int fd, void* cookie) { } bool success = true; success &= remount_partition(fd, "/system", &system_ro); success &= remount_partition(fd, "/vendor", &vendor_ro); success &= remount_partition(fd, "/oem", &oem_ro); success &= remount_partition(fd, "/system"); success &= remount_partition(fd, "/vendor"); success &= remount_partition(fd, "/oem"); WriteFdExactly(fd, success ? "remount succeeded\n" : "remount failed\n"); Loading
adb/remount_service.h +1 −1 Original line number Diff line number Diff line Loading @@ -19,7 +19,7 @@ #include <string> int make_block_device_writable(const std::string&); bool make_block_device_writable(const std::string&); void remount_service(int, void*); #endif
adb/set_verity_enable_state_service.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -86,7 +86,7 @@ static int set_verity_enabled_state(int fd, const char *block_device, int device = -1; int retval = -1; if (make_block_device_writable(block_device)) { if (!make_block_device_writable(block_device)) { WriteFdFmt(fd, "Could not make block device %s writable (%s).\n", block_device, strerror(errno)); goto errout; Loading