Fix free_cache to actually work
This broke with some other path-related changes, so it was scanning for /data/*/cache instead of /data/data/*/cache Also remove redundant call to restat Bug: 5686310 Change-Id: Id1661f0f1337858fc9ead53c56ab7557f421c591
This commit is contained in:
@ -184,6 +184,7 @@ int free_cache(int64_t free_size)
|
||||
DIR *d;
|
||||
struct dirent *de;
|
||||
int64_t avail;
|
||||
char datadir[PKG_PATH_MAX];
|
||||
|
||||
avail = disk_free();
|
||||
if (avail < 0) return -1;
|
||||
@ -191,9 +192,14 @@ int free_cache(int64_t free_size)
|
||||
LOGI("free_cache(%" PRId64 ") avail %" PRId64 "\n", free_size, avail);
|
||||
if (avail >= free_size) return 0;
|
||||
|
||||
d = opendir(android_data_dir.path);
|
||||
if (create_persona_path(datadir, 0)) {
|
||||
LOGE("couldn't get directory for persona 0");
|
||||
return -1;
|
||||
}
|
||||
|
||||
d = opendir(datadir);
|
||||
if (d == NULL) {
|
||||
LOGE("cannot open %s: %s\n", android_data_dir.path, strerror(errno));
|
||||
LOGE("cannot open %s: %s\n", datadir, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
dfd = dirfd(d);
|
||||
@ -578,19 +584,6 @@ fail:
|
||||
return -1;
|
||||
}
|
||||
|
||||
int create_move_path(char path[PKG_PATH_MAX],
|
||||
const char* pkgname,
|
||||
const char* leaf,
|
||||
uid_t persona)
|
||||
{
|
||||
if ((android_data_dir.len + strlen(pkgname) + strlen(leaf) + 1) >= PKG_PATH_MAX) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
sprintf(path, "%s%s%s/%s", android_data_dir.path, PRIMARY_USER_PREFIX, pkgname, leaf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void mkinnerdirs(char* path, int basepos, mode_t mode, int uid, int gid,
|
||||
struct stat* statbuf)
|
||||
{
|
||||
|
@ -105,6 +105,11 @@ int create_pkg_path(char path[PKG_PATH_MAX],
|
||||
int create_persona_path(char path[PKG_PATH_MAX],
|
||||
uid_t persona);
|
||||
|
||||
int create_move_path(char path[PKG_PATH_MAX],
|
||||
const char* pkgname,
|
||||
const char* leaf,
|
||||
uid_t persona);
|
||||
|
||||
int is_valid_package_name(const char* pkgname);
|
||||
|
||||
int create_cache_path(char path[PKG_PATH_MAX], const char *src);
|
||||
|
@ -34,6 +34,16 @@ extern "C" {
|
||||
#define TEST_SYSTEM_DIR1 "/system/app/"
|
||||
#define TEST_SYSTEM_DIR2 "/vendor/app/"
|
||||
|
||||
#define REALLY_LONG_APP_NAME "com.example." \
|
||||
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa." \
|
||||
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa." \
|
||||
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
||||
|
||||
#define REALLY_LONG_LEAF_NAME "shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_" \
|
||||
"shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_" \
|
||||
"shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_" \
|
||||
"shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_"
|
||||
|
||||
namespace android {
|
||||
|
||||
class UtilsTest : public testing::Test {
|
||||
@ -210,7 +220,7 @@ TEST_F(UtilsTest, CheckSystemApp_BadPathEscapeFail) {
|
||||
|
||||
TEST_F(UtilsTest, GetPathFromString_NullPathFail) {
|
||||
dir_rec_t test1;
|
||||
EXPECT_EQ(-1, get_path_from_string(&test1, NULL))
|
||||
EXPECT_EQ(-1, get_path_from_string(&test1, (const char *) NULL))
|
||||
<< "Should not allow NULL as a path.";
|
||||
}
|
||||
|
||||
@ -327,6 +337,50 @@ TEST_F(UtilsTest, CreatePkgPathInDir_ProtectedDir) {
|
||||
<< "Package path should be in /data/app-private/";
|
||||
}
|
||||
|
||||
TEST_F(UtilsTest, CreatePersonaPath_Primary) {
|
||||
char path[PKG_PATH_MAX];
|
||||
|
||||
EXPECT_EQ(0, create_persona_path(path, 0))
|
||||
<< "Should successfully build primary user path.";
|
||||
|
||||
EXPECT_STREQ("/data/data/", path)
|
||||
<< "Primary user should have correct path";
|
||||
}
|
||||
|
||||
TEST_F(UtilsTest, CreatePersonaPath_Secondary) {
|
||||
char path[PKG_PATH_MAX];
|
||||
|
||||
EXPECT_EQ(0, create_persona_path(path, 1))
|
||||
<< "Should successfully build primary user path.";
|
||||
|
||||
EXPECT_STREQ("/data/user/1/", path)
|
||||
<< "Primary user should have correct path";
|
||||
}
|
||||
|
||||
TEST_F(UtilsTest, CreateMovePath_Primary) {
|
||||
char path[PKG_PATH_MAX];
|
||||
|
||||
EXPECT_EQ(0, create_move_path(path, "com.android.test", "shared_prefs", 0))
|
||||
<< "Should be able to create move path for primary user";
|
||||
|
||||
EXPECT_STREQ("/data/data/com.android.test/shared_prefs", path)
|
||||
<< "Primary user package directory should be created correctly";
|
||||
}
|
||||
|
||||
TEST_F(UtilsTest, CreateMovePath_Fail_AppTooLong) {
|
||||
char path[PKG_PATH_MAX];
|
||||
|
||||
EXPECT_EQ(-1, create_move_path(path, REALLY_LONG_APP_NAME, "shared_prefs", 0))
|
||||
<< "Should fail to create move path for primary user";
|
||||
}
|
||||
|
||||
TEST_F(UtilsTest, CreateMovePath_Fail_LeafTooLong) {
|
||||
char path[PKG_PATH_MAX];
|
||||
|
||||
EXPECT_EQ(-1, create_move_path(path, "com.android.test", REALLY_LONG_LEAF_NAME, 0))
|
||||
<< "Should fail to create move path for primary user";
|
||||
}
|
||||
|
||||
TEST_F(UtilsTest, CopyAndAppend_Normal) {
|
||||
//int copy_and_append(dir_rec_t* dst, dir_rec_t* src, char* suffix)
|
||||
dir_rec_t dst;
|
||||
|
@ -109,7 +109,7 @@ int create_persona_path(char path[PKG_PATH_MAX],
|
||||
uid_len = 0;
|
||||
} else {
|
||||
persona_prefix = SECONDARY_USER_PREFIX;
|
||||
uid_len = snprintf(NULL, 0, "%d", persona);
|
||||
uid_len = snprintf(NULL, 0, "%d/", persona);
|
||||
}
|
||||
|
||||
char *dst = path;
|
||||
@ -126,7 +126,7 @@ int create_persona_path(char path[PKG_PATH_MAX],
|
||||
LOGE("Error building user path");
|
||||
return -1;
|
||||
}
|
||||
int ret = snprintf(dst, dst_size, "%d", persona);
|
||||
int ret = snprintf(dst, dst_size, "%d/", persona);
|
||||
if (ret < 0 || (size_t) ret != uid_len) {
|
||||
LOGE("Error appending persona id to path");
|
||||
return -1;
|
||||
@ -135,6 +135,20 @@ int create_persona_path(char path[PKG_PATH_MAX],
|
||||
return 0;
|
||||
}
|
||||
|
||||
int create_move_path(char path[PKG_PATH_MAX],
|
||||
const char* pkgname,
|
||||
const char* leaf,
|
||||
uid_t persona)
|
||||
{
|
||||
if ((android_data_dir.len + strlen(PRIMARY_USER_PREFIX) + strlen(pkgname) + strlen(leaf) + 1)
|
||||
>= PKG_PATH_MAX) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
sprintf(path, "%s%s%s/%s", android_data_dir.path, PRIMARY_USER_PREFIX, pkgname, leaf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether the package name is valid. Returns -1 on error and
|
||||
* 0 on success.
|
||||
|
@ -163,7 +163,6 @@ public class DeviceStorageMonitorService extends Binder {
|
||||
} catch (IllegalArgumentException e) {
|
||||
// ignore; report -1
|
||||
}
|
||||
mCacheFileStats.restat(CACHE_PATH);
|
||||
EventLog.writeEvent(EventLogTags.FREE_STORAGE_LEFT,
|
||||
mFreeMem, mFreeSystem, mFreeCache);
|
||||
}
|
||||
|
Reference in New Issue
Block a user