From 98a0128e44baf60b630d39221de580716a98aa7f Mon Sep 17 00:00:00 2001 From: Mark Salyzyn Date: Mon, 13 May 2019 09:14:55 -0700 Subject: [PATCH] fs_mgr: overlayfs: ReadFstabFromFile touches errno Regression from commit 77c28476f19c910a869af878c8983d52e53c07b ("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 --- fs_mgr/fs_mgr_fstab.cpp | 2 ++ fs_mgr/fs_mgr_overlayfs.cpp | 8 +++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/fs_mgr/fs_mgr_fstab.cpp b/fs_mgr/fs_mgr_fstab.cpp index c31de30d8..0cbdcce85 100644 --- a/fs_mgr/fs_mgr_fstab.cpp +++ b/fs_mgr/fs_mgr_fstab.cpp @@ -700,7 +700,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; } diff --git a/fs_mgr/fs_mgr_overlayfs.cpp b/fs_mgr/fs_mgr_overlayfs.cpp index 71c4072e5..a64997532 100644 --- a/fs_mgr/fs_mgr_overlayfs.cpp +++ b/fs_mgr/fs_mgr_overlayfs.cpp @@ -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;