Skip to content

Commit ad757e9

Browse files
committed
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
1 parent 88f10c6 commit ad757e9

File tree

5 files changed

+84
-19
lines changed

5 files changed

+84
-19
lines changed

cmds/installd/commands.c

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -184,16 +184,22 @@ int free_cache(int64_t free_size)
184184
DIR *d;
185185
struct dirent *de;
186186
int64_t avail;
187+
char datadir[PKG_PATH_MAX];
187188

188189
avail = disk_free();
189190
if (avail < 0) return -1;
190191

191192
LOGI("free_cache(%" PRId64 ") avail %" PRId64 "\n", free_size, avail);
192193
if (avail >= free_size) return 0;
193194

194-
d = opendir(android_data_dir.path);
195+
if (create_persona_path(datadir, 0)) {
196+
LOGE("couldn't get directory for persona 0");
197+
return -1;
198+
}
199+
200+
d = opendir(datadir);
195201
if (d == NULL) {
196-
LOGE("cannot open %s: %s\n", android_data_dir.path, strerror(errno));
202+
LOGE("cannot open %s: %s\n", datadir, strerror(errno));
197203
return -1;
198204
}
199205
dfd = dirfd(d);
@@ -578,19 +584,6 @@ int dexopt(const char *apk_path, uid_t uid, int is_public)
578584
return -1;
579585
}
580586

581-
int create_move_path(char path[PKG_PATH_MAX],
582-
const char* pkgname,
583-
const char* leaf,
584-
uid_t persona)
585-
{
586-
if ((android_data_dir.len + strlen(pkgname) + strlen(leaf) + 1) >= PKG_PATH_MAX) {
587-
return -1;
588-
}
589-
590-
sprintf(path, "%s%s%s/%s", android_data_dir.path, PRIMARY_USER_PREFIX, pkgname, leaf);
591-
return 0;
592-
}
593-
594587
void mkinnerdirs(char* path, int basepos, mode_t mode, int uid, int gid,
595588
struct stat* statbuf)
596589
{

cmds/installd/installd.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,11 @@ int create_pkg_path(char path[PKG_PATH_MAX],
105105
int create_persona_path(char path[PKG_PATH_MAX],
106106
uid_t persona);
107107

108+
int create_move_path(char path[PKG_PATH_MAX],
109+
const char* pkgname,
110+
const char* leaf,
111+
uid_t persona);
112+
108113
int is_valid_package_name(const char* pkgname);
109114

110115
int create_cache_path(char path[PKG_PATH_MAX], const char *src);

cmds/installd/tests/installd_utils_test.cpp

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,16 @@ extern "C" {
3434
#define TEST_SYSTEM_DIR1 "/system/app/"
3535
#define TEST_SYSTEM_DIR2 "/vendor/app/"
3636

37+
#define REALLY_LONG_APP_NAME "com.example." \
38+
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa." \
39+
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa." \
40+
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
41+
42+
#define REALLY_LONG_LEAF_NAME "shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_" \
43+
"shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_" \
44+
"shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_" \
45+
"shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_shared_prefs_"
46+
3747
namespace android {
3848

3949
class UtilsTest : public testing::Test {
@@ -210,7 +220,7 @@ TEST_F(UtilsTest, CheckSystemApp_BadPathEscapeFail) {
210220

211221
TEST_F(UtilsTest, GetPathFromString_NullPathFail) {
212222
dir_rec_t test1;
213-
EXPECT_EQ(-1, get_path_from_string(&test1, NULL))
223+
EXPECT_EQ(-1, get_path_from_string(&test1, (const char *) NULL))
214224
<< "Should not allow NULL as a path.";
215225
}
216226

@@ -327,6 +337,50 @@ TEST_F(UtilsTest, CreatePkgPathInDir_ProtectedDir) {
327337
<< "Package path should be in /data/app-private/";
328338
}
329339

340+
TEST_F(UtilsTest, CreatePersonaPath_Primary) {
341+
char path[PKG_PATH_MAX];
342+
343+
EXPECT_EQ(0, create_persona_path(path, 0))
344+
<< "Should successfully build primary user path.";
345+
346+
EXPECT_STREQ("/data/data/", path)
347+
<< "Primary user should have correct path";
348+
}
349+
350+
TEST_F(UtilsTest, CreatePersonaPath_Secondary) {
351+
char path[PKG_PATH_MAX];
352+
353+
EXPECT_EQ(0, create_persona_path(path, 1))
354+
<< "Should successfully build primary user path.";
355+
356+
EXPECT_STREQ("/data/user/1/", path)
357+
<< "Primary user should have correct path";
358+
}
359+
360+
TEST_F(UtilsTest, CreateMovePath_Primary) {
361+
char path[PKG_PATH_MAX];
362+
363+
EXPECT_EQ(0, create_move_path(path, "com.android.test", "shared_prefs", 0))
364+
<< "Should be able to create move path for primary user";
365+
366+
EXPECT_STREQ("/data/data/com.android.test/shared_prefs", path)
367+
<< "Primary user package directory should be created correctly";
368+
}
369+
370+
TEST_F(UtilsTest, CreateMovePath_Fail_AppTooLong) {
371+
char path[PKG_PATH_MAX];
372+
373+
EXPECT_EQ(-1, create_move_path(path, REALLY_LONG_APP_NAME, "shared_prefs", 0))
374+
<< "Should fail to create move path for primary user";
375+
}
376+
377+
TEST_F(UtilsTest, CreateMovePath_Fail_LeafTooLong) {
378+
char path[PKG_PATH_MAX];
379+
380+
EXPECT_EQ(-1, create_move_path(path, "com.android.test", REALLY_LONG_LEAF_NAME, 0))
381+
<< "Should fail to create move path for primary user";
382+
}
383+
330384
TEST_F(UtilsTest, CopyAndAppend_Normal) {
331385
//int copy_and_append(dir_rec_t* dst, dir_rec_t* src, char* suffix)
332386
dir_rec_t dst;

cmds/installd/utils.c

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ int create_persona_path(char path[PKG_PATH_MAX],
109109
uid_len = 0;
110110
} else {
111111
persona_prefix = SECONDARY_USER_PREFIX;
112-
uid_len = snprintf(NULL, 0, "%d", persona);
112+
uid_len = snprintf(NULL, 0, "%d/", persona);
113113
}
114114

115115
char *dst = path;
@@ -126,7 +126,7 @@ int create_persona_path(char path[PKG_PATH_MAX],
126126
LOGE("Error building user path");
127127
return -1;
128128
}
129-
int ret = snprintf(dst, dst_size, "%d", persona);
129+
int ret = snprintf(dst, dst_size, "%d/", persona);
130130
if (ret < 0 || (size_t) ret != uid_len) {
131131
LOGE("Error appending persona id to path");
132132
return -1;
@@ -135,6 +135,20 @@ int create_persona_path(char path[PKG_PATH_MAX],
135135
return 0;
136136
}
137137

138+
int create_move_path(char path[PKG_PATH_MAX],
139+
const char* pkgname,
140+
const char* leaf,
141+
uid_t persona)
142+
{
143+
if ((android_data_dir.len + strlen(PRIMARY_USER_PREFIX) + strlen(pkgname) + strlen(leaf) + 1)
144+
>= PKG_PATH_MAX) {
145+
return -1;
146+
}
147+
148+
sprintf(path, "%s%s%s/%s", android_data_dir.path, PRIMARY_USER_PREFIX, pkgname, leaf);
149+
return 0;
150+
}
151+
138152
/**
139153
* Checks whether the package name is valid. Returns -1 on error and
140154
* 0 on success.

services/java/com/android/server/DeviceStorageMonitorService.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,6 @@ private final void restatDataDir() {
163163
} catch (IllegalArgumentException e) {
164164
// ignore; report -1
165165
}
166-
mCacheFileStats.restat(CACHE_PATH);
167166
EventLog.writeEvent(EventLogTags.FREE_STORAGE_LEFT,
168167
mFreeMem, mFreeSystem, mFreeCache);
169168
}

0 commit comments

Comments
 (0)