fs_mgr: overlayfs: ReadFstabFromFile touches errno

(cherry picked from commit 98a0128e44)

Regression from commit 77c28476f1
("Remove the mount points defined in skip_mount.cfg from
ReadDefaultFstab()") resulted in ReadFstabFromFile to report
errno ENOENT even upon success, preventing clear error propagation
for real failures (ReadFstabFromFile would _always_ report ENOENT).

The bad error propagation resulted in an adb remount failure.

Added immunization against future adjustments that may also
result in a similar regression in adb remount behaviors.

Test: adb-remount-test.sh
Bug: 132594161
Bug: 128961335
Change-Id: Icf5d48bbfc6d938d4b9657ca8004a6a6ddaab5a6
This commit is contained in:
Mark Salyzyn 2019-05-13 09:14:55 -07:00
parent 122bf2aedf
commit 8471f92a20
2 changed files with 9 additions and 1 deletions

View File

@ -704,7 +704,9 @@ bool SkipMountingPartitions(Fstab* fstab) {
constexpr const char kSkipMountConfig[] = "/system/etc/init/config/skip_mount.cfg";
std::string skip_config;
auto save_errno = errno;
if (!ReadFileToString(kSkipMountConfig, &skip_config)) {
errno = save_errno; // missing file is expected
return true;
}

View File

@ -139,7 +139,11 @@ bool fs_mgr_filesystem_has_space(const std::string& mount_point) {
// If we have access issues to find out space remaining, return true
// to prevent us trying to override with overlayfs.
struct statvfs vst;
if (statvfs(mount_point.c_str(), &vst)) return true;
auto save_errno = errno;
if (statvfs(mount_point.c_str(), &vst)) {
errno = save_errno;
return true;
}
static constexpr int kPercentThreshold = 1; // 1%
@ -265,9 +269,11 @@ bool fs_mgr_rw_access(const std::string& path) {
bool fs_mgr_overlayfs_already_mounted(const std::string& mount_point, bool overlay_only = true) {
Fstab fstab;
auto save_errno = errno;
if (!ReadFstabFromFile("/proc/mounts", &fstab)) {
return false;
}
errno = save_errno;
const auto lowerdir = kLowerdirOption + mount_point;
for (const auto& entry : fstab) {
if (overlay_only && "overlay" != entry.fs_type && "overlayfs" != entry.fs_type) continue;