diff options
| author | 2016-10-31 19:17:36 +0000 | |
|---|---|---|
| committer | 2016-10-31 19:17:36 +0000 | |
| commit | c981bfb460013d4181b43d19ec40cc4406e17e3e (patch) | |
| tree | 2f2ea74fefe2d543f699d3973153f2dbac5203ec /cmds/installd/commands.cpp | |
| parent | 2a221ffc019d28d640eede855272faa7bb6561e9 (diff) | |
| parent | 6437218b85d1a454105add9f4afa7becf5408497 (diff) | |
Check and restorecon cache/code_cache directories. am: 397ec26675
am: 6437218b85
Change-Id: I5fed67126cbcb03ac946507eada3fd66ada6c266
Diffstat (limited to 'cmds/installd/commands.cpp')
| -rw-r--r-- | cmds/installd/commands.cpp | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/cmds/installd/commands.cpp b/cmds/installd/commands.cpp index 4ed8997fcb..271c75ba4e 100644 --- a/cmds/installd/commands.cpp +++ b/cmds/installd/commands.cpp @@ -104,7 +104,7 @@ static std::string create_primary_profile(const std::string& profile_dir) { * if the label of that top-level file actually changed. This can save us * significant time by avoiding no-op traversals of large filesystem trees. */ -static int restorecon_app_data_lazy(const char* path, const char* seinfo, uid_t uid) { +static int restorecon_app_data_lazy(const std::string& path, const char* seinfo, uid_t uid) { int res = 0; char* before = nullptr; char* after = nullptr; @@ -112,15 +112,15 @@ static int restorecon_app_data_lazy(const char* path, const char* seinfo, uid_t // Note that SELINUX_ANDROID_RESTORECON_DATADATA flag is set by // libselinux. Not needed here. - if (lgetfilecon(path, &before) < 0) { + if (lgetfilecon(path.c_str(), &before) < 0) { PLOG(ERROR) << "Failed before getfilecon for " << path; goto fail; } - if (selinux_android_restorecon_pkgdir(path, seinfo, uid, 0) < 0) { + if (selinux_android_restorecon_pkgdir(path.c_str(), seinfo, uid, 0) < 0) { PLOG(ERROR) << "Failed top-level restorecon for " << path; goto fail; } - if (lgetfilecon(path, &after) < 0) { + if (lgetfilecon(path.c_str(), &after) < 0) { PLOG(ERROR) << "Failed after getfilecon for " << path; goto fail; } @@ -130,7 +130,7 @@ static int restorecon_app_data_lazy(const char* path, const char* seinfo, uid_t if (strcmp(before, after)) { LOG(DEBUG) << "Detected label change from " << before << " to " << after << " at " << path << "; running recursive restorecon"; - if (selinux_android_restorecon_pkgdir(path, seinfo, uid, + if (selinux_android_restorecon_pkgdir(path.c_str(), seinfo, uid, SELINUX_ANDROID_RESTORECON_RECURSE) < 0) { PLOG(ERROR) << "Failed recursive restorecon for " << path; goto fail; @@ -146,6 +146,11 @@ done: return res; } +static int restorecon_app_data_lazy(const std::string& parent, const char* name, const char* seinfo, + uid_t uid) { + return restorecon_app_data_lazy(StringPrintf("%s/%s", parent.c_str(), name), seinfo, uid); +} + static int prepare_app_dir(const std::string& path, mode_t target_mode, uid_t uid) { if (fs_prepare_dir_strict(path.c_str(), target_mode, uid, uid) != 0) { PLOG(ERROR) << "Failed to prepare " << path; @@ -172,7 +177,9 @@ int create_app_data(const char *uuid, const char *pkgname, userid_t userid, int } // Consider restorecon over contents if label changed - if (restorecon_app_data_lazy(path.c_str(), seinfo, uid)) { + if (restorecon_app_data_lazy(path, seinfo, uid) || + restorecon_app_data_lazy(path, "cache", seinfo, uid) || + restorecon_app_data_lazy(path, "code_cache", seinfo, uid)) { return -1; } @@ -191,7 +198,7 @@ int create_app_data(const char *uuid, const char *pkgname, userid_t userid, int } // Consider restorecon over contents if label changed - if (restorecon_app_data_lazy(path.c_str(), seinfo, uid)) { + if (restorecon_app_data_lazy(path, seinfo, uid)) { return -1; } |