diff options
author | 2023-11-28 19:06:34 +0000 | |
---|---|---|
committer | 2023-11-28 20:56:32 +0000 | |
commit | 02dca6bc68b30ec09bf9ac4878277dd9ab33ad75 (patch) | |
tree | b56eddc1c966a8f95697edb043c8c35a101bf1e6 | |
parent | aa627355e44f15f22703515253adae994e6aafe6 (diff) |
Resume interrupted restorecon in a separate thread.
The previous restorecon was interrupted. It's either crashed (unlikely), or the phone was rebooted. Possibly because it took too much time. This time let's move it to a separate thread - so it won't block the rest of the OS.
Fixes: 308541523
Test: presubmit
Change-Id: I523ab86dfa53180db1b58e5544a701144981152f
-rw-r--r-- | cmds/installd/InstalldNativeService.cpp | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/cmds/installd/InstalldNativeService.cpp b/cmds/installd/InstalldNativeService.cpp index 1347450a77..cad77874fd 100644 --- a/cmds/installd/InstalldNativeService.cpp +++ b/cmds/installd/InstalldNativeService.cpp @@ -40,6 +40,7 @@ #include <fstream> #include <functional> #include <regex> +#include <thread> #include <unordered_set> #include <android-base/file.h> @@ -556,19 +557,33 @@ static int restorecon_app_data_lazy(const std::string& path, const std::string& // If the initial top-level restorecon above changed the label, then go // back and restorecon everything recursively if (inProgress || before != after) { - ScopedTrace tracer("label-change"); if (existing) { LOG(DEBUG) << "Detected label change from " << before << " to " << after << " at " - << path << "; running recursive restorecon"; + << path << "; running recursive restorecon"; } - // Temporary mark the folder as "in-progress" to resume in case of reboot/other failure. - RestoreconInProgress fence(path); + auto restorecon = [path, seInfo, uid]() { + ScopedTrace tracer("label-change"); - if (selinux_android_restorecon_pkgdir(path.c_str(), seInfo.c_str(), uid, - SELINUX_ANDROID_RESTORECON_RECURSE) < 0) { - PLOG(ERROR) << "Failed recursive restorecon for " << path; - return -1; + // Temporary mark the folder as "in-progress" to resume in case of reboot/other failure. + RestoreconInProgress fence(path); + + if (selinux_android_restorecon_pkgdir(path.c_str(), seInfo.c_str(), uid, + SELINUX_ANDROID_RESTORECON_RECURSE) < 0) { + PLOG(ERROR) << "Failed recursive restorecon for " << path; + return -1; + } + return 0; + }; + if (inProgress) { + // The previous restorecon was interrupted. It's either crashed (unlikely), or the phone + // was rebooted. Possibly because it took too much time. This time let's move it to a + // separate thread - so it won't block the rest of the OS. + std::thread(restorecon).detach(); + } else { + if (int result = restorecon(); result) { + return result; + } } } |