summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNarayan Kamath <narayan@google.com>2014-06-24 12:07:36 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2014-06-24 06:22:45 +0000
commit357df19b14b8387a480ed68dd6ea92eeb1aa4edc (patch)
tree0592af0105a8301a2265812e439b091d450c30ec
parent71f9956a23885e64626828a1afa8c512e29be8cc (diff)
parent1e57e4af8afb5a3b8b657e1c9ca3f9810e266083 (diff)
downloadnative-357df19b14b8387a480ed68dd6ea92eeb1aa4edc.tar.gz
Merge "Exclude subdirectories when pruning the dex cache."
-rw-r--r--cmds/installd/commands.c31
-rw-r--r--cmds/installd/installd.c4
-rw-r--r--cmds/installd/installd.h2
3 files changed, 29 insertions, 8 deletions
diff --git a/cmds/installd/commands.c b/cmds/installd/commands.c
index 974c865921..01eb5efa5a 100644
--- a/cmds/installd/commands.c
+++ b/cmds/installd/commands.c
@@ -1384,10 +1384,11 @@ int restorecon_data(const char* pkgName, const char* seinfo, uid_t uid)
static int prune_dex_exclusion_predicate(const char *file_name, const int is_dir)
{
- // Don't exclude any directories, we want to inspect them
- // recusively for files.
+ // Exclude all directories. The top level command will be
+ // given a list of ISA specific directories that are assumed
+ // to be flat.
if (is_dir) {
- return 0;
+ return 1;
}
@@ -1405,6 +1406,26 @@ static int prune_dex_exclusion_predicate(const char *file_name, const int is_dir
return 1;
}
-int prune_dex_cache() {
- return delete_dir_contents(DALVIK_CACHE_PREFIX, 0, &prune_dex_exclusion_predicate);
+int prune_dex_cache(const char* subdir) {
+ // "." is handled as a special case, and refers to
+ // DALVIK_CACHE_PREFIX (usually /data/dalvik-cache).
+ const bool is_dalvik_cache_root = !strcmp(subdir, ".");
+
+ // Don't allow the path to contain "." or ".." except for the
+ // special case above. This is much stricter than we need to be,
+ // but there's no good reason to support them.
+ if (strchr(subdir, '.' ) != NULL && !is_dalvik_cache_root) {
+ return -1;
+ }
+
+ if (!is_dalvik_cache_root) {
+ char full_path[PKG_PATH_MAX];
+ snprintf(full_path, sizeof(full_path), "%s%s", DALVIK_CACHE_PREFIX, subdir);
+ return delete_dir_contents(full_path, 0, &prune_dex_exclusion_predicate);
+ }
+
+
+ // When subdir == ".", clean the contents of the top level
+ // dalvik-cache directory.
+ return delete_dir_contents(DALVIK_CACHE_PREFIX, 0, &prune_dex_exclusion_predicate);
}
diff --git a/cmds/installd/installd.c b/cmds/installd/installd.c
index 4368a9ecbc..45cc2b267c 100644
--- a/cmds/installd/installd.c
+++ b/cmds/installd/installd.c
@@ -143,7 +143,7 @@ static int do_restorecon_data(char **arg, char reply[REPLY_MAX] __attribute__((u
static int do_prune_dex_cache(char **arg __attribute__((unused)),
char reply[REPLY_MAX] __attribute__((unused)))
{
- return prune_dex_cache();
+ return prune_dex_cache(arg[0] /* subdirectory name */);
}
struct cmdinfo {
@@ -172,7 +172,7 @@ struct cmdinfo cmds[] = {
{ "rmuser", 1, do_rm_user },
{ "idmap", 3, do_idmap },
{ "restorecondata", 3, do_restorecon_data },
- { "prunedexcache", 0, do_prune_dex_cache },
+ { "prunedexcache", 1, do_prune_dex_cache },
};
static int readx(int s, void *_buf, int count)
diff --git a/cmds/installd/installd.h b/cmds/installd/installd.h
index c1e6e0fbda..f193b466fd 100644
--- a/cmds/installd/installd.h
+++ b/cmds/installd/installd.h
@@ -220,4 +220,4 @@ int movefiles();
int linklib(const char* target, const char* source, int userId);
int idmap(const char *target_path, const char *overlay_path, uid_t uid);
int restorecon_data();
-int prune_dex_cache();
+int prune_dex_cache(const char* subdir);