From 3a1bccd9f226cba5b9558b41318afe0cd728a77a Mon Sep 17 00:00:00 2001 From: Daniel Rosenberg Date: Tue, 12 May 2020 02:17:15 -0700 Subject: [PATCH] Check property for sdcardfs use Sdcardfs is only used if present in the kernel, and external_storage.sdcardfs.enabled=0. For compatibility, this property defaults to 1. Bug: 155222498 Test: mount|grep "type sdcardfs" should find nothing after boot complete if external_storage.sdcardfs.enabled=0 Change-Id: Ide648405c260ac46d07877c3a7b78a8bee48e09a --- .../jni/android_os_storage_StorageManager.cpp | 16 ++----- core/jni/com_android_internal_os_Zygote.cpp | 29 +++++-------- core/jni/filesystem_utils.h | 43 +++++++++++++++++++ 3 files changed, 56 insertions(+), 32 deletions(-) create mode 100644 core/jni/filesystem_utils.h diff --git a/core/jni/android_os_storage_StorageManager.cpp b/core/jni/android_os_storage_StorageManager.cpp index fd3e66b1bbce4..3116cc8f19e69 100644 --- a/core/jni/android_os_storage_StorageManager.cpp +++ b/core/jni/android_os_storage_StorageManager.cpp @@ -17,33 +17,23 @@ #define LOG_TAG "StorageManager" #include #include +#include #include #include #include #include #include "core_jni_helpers.h" +#include "filesystem_utils.h" namespace android { -static const char* kProcFilesystems = "/proc/filesystems"; - -// Checks whether the passed in filesystem is listed in /proc/filesystems -static bool IsFilesystemSupported(const std::string& fsType) { - std::string supported; - if (!android::base::ReadFileToString(kProcFilesystems, &supported)) { - PLOG(ERROR) << "Failed to read supported filesystems"; - return false; - } - return supported.find(fsType + "\n") != std::string::npos; -} - jboolean android_os_storage_StorageManager_setQuotaProjectId(JNIEnv* env, jobject self, jstring path, jlong projectId) { struct fsxattr fsx; ScopedUtfChars utf_chars_path(env, path); - static bool sdcardFsSupported = IsFilesystemSupported("sdcardfs"); + static bool sdcardFsSupported = IsSdcardfsUsed(); if (sdcardFsSupported) { // sdcardfs doesn't support project ID quota tracking and takes care of quota // in a different way. diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp index c5bc083dfabf7..fc2005a31696c 100644 --- a/core/jni/com_android_internal_os_Zygote.cpp +++ b/core/jni/com_android_internal_os_Zygote.cpp @@ -88,12 +88,13 @@ #include #include -#include "core_jni_helpers.h" #include #include #include #include +#include "core_jni_helpers.h" #include "fd_utils.h" +#include "filesystem_utils.h" #include "nativebridge/native_bridge.h" @@ -614,15 +615,6 @@ static void EnableDebugger() { } } -static bool IsFilesystemSupported(const std::string& fsType) { - std::string supported; - if (!ReadFileToString("/proc/filesystems", &supported)) { - ALOGE("Failed to read supported filesystems"); - return false; - } - return supported.find(fsType + "\n") != std::string::npos; -} - static void PreApplicationInit() { // The child process sets this to indicate it's not the zygote. android_mallopt(M_SET_ZYGOTE_CHILD, nullptr, 0); @@ -1554,15 +1546,14 @@ static void isolateJitProfile(JNIEnv* env, jobjectArray pkg_data_info_list, static void BindMountStorageToLowerFs(const userid_t user_id, const uid_t uid, const char* dir_name, const char* package, fail_fn_t fail_fn) { - - bool hasSdcardFs = IsFilesystemSupported("sdcardfs"); - std::string source; - if (hasSdcardFs) { - source = StringPrintf("/mnt/runtime/default/emulated/%d/%s/%s", user_id, dir_name, package); - } else { - source = StringPrintf("/mnt/pass_through/%d/emulated/%d/%s/%s", - user_id, user_id, dir_name, package); - } + bool hasSdcardFs = IsSdcardfsUsed(); + std::string source; + if (hasSdcardFs) { + source = StringPrintf("/mnt/runtime/default/emulated/%d/%s/%s", user_id, dir_name, package); + } else { + source = StringPrintf("/mnt/pass_through/%d/emulated/%d/%s/%s", user_id, user_id, dir_name, + package); + } std::string target = StringPrintf("/storage/emulated/%d/%s/%s", user_id, dir_name, package); // As the parent is mounted as tmpfs, we need to create the target dir here. diff --git a/core/jni/filesystem_utils.h b/core/jni/filesystem_utils.h new file mode 100644 index 0000000000000..c4728a09883b7 --- /dev/null +++ b/core/jni/filesystem_utils.h @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FRAMEWORKS_BASE_CORE_JNI_MISC_UTILS_H_ +#define FRAMEWORKS_BASE_CORE_JNI_MISC_UTILS_H_ + +#include +#include +#include +#include +#include + +namespace { +static constexpr const char* kExternalStorageSdcardfs = "external_storage.sdcardfs.enabled"; + +static bool IsFilesystemSupported(const std::string& fsType) { + std::string supported; + if (!android::base::ReadFileToString("/proc/filesystems", &supported)) { + ALOGE("Failed to read supported filesystems"); + return false; + } + return supported.find(fsType + "\n") != std::string::npos; +} + +static inline bool IsSdcardfsUsed() { + return IsFilesystemSupported("sdcardfs") && + android::base::GetBoolProperty(kExternalStorageSdcardfs, true); +} +} // namespace +#endif // FRAMEWORKS_BASE_CORE_JNI_MISC_UTILS_H_