Loading cmds/installd/tests/installd_utils_test.cpp +24 −6 Original line number Original line Diff line number Diff line Loading @@ -168,12 +168,6 @@ TEST_F(UtilsTest, IsValidApkPath_EscapeFail) { << badasec1 << " should be rejected as a invalid path"; << badasec1 << " should be rejected as a invalid path"; } } TEST_F(UtilsTest, IsValidApkPath_DoubleSlashFail) { const char *badasec2 = TEST_ASEC_DIR "com.example.asec//pkg.apk"; EXPECT_EQ(-1, validate_apk_path(badasec2)) << badasec2 << " should be rejected as a invalid path"; } TEST_F(UtilsTest, IsValidApkPath_SubdirEscapeFail) { TEST_F(UtilsTest, IsValidApkPath_SubdirEscapeFail) { const char *badasec3 = TEST_ASEC_DIR "com.example.asec/../../../pkg.apk"; const char *badasec3 = TEST_ASEC_DIR "com.example.asec/../../../pkg.apk"; EXPECT_EQ(-1, validate_apk_path(badasec3)) EXPECT_EQ(-1, validate_apk_path(badasec3)) Loading Loading @@ -451,5 +445,29 @@ TEST_F(UtilsTest, ValidateSecondaryDexFilesPath) { package_name, app_dir_ce_user_10 + "/" + too_long, app_uid_for_user_10, FLAG_STORAGE_CE); package_name, app_dir_ce_user_10 + "/" + too_long, app_uid_for_user_10, FLAG_STORAGE_CE); } } TEST_F(UtilsTest, ValidateApkPath) { EXPECT_EQ(0, validate_apk_path("/data/app/com.example")); EXPECT_EQ(0, validate_apk_path("/data/app/com.example/file")); EXPECT_EQ(0, validate_apk_path("/data/app/com.example//file")); EXPECT_NE(0, validate_apk_path("/data/app/com.example/dir/")); EXPECT_NE(0, validate_apk_path("/data/app/com.example/dir/file")); EXPECT_NE(0, validate_apk_path("/data/app/com.example/dir/dir/file")); EXPECT_NE(0, validate_apk_path("/data/app/com.example/dir/dir//file")); EXPECT_NE(0, validate_apk_path("/data/app/com.example/dir/dir/dir/file")); EXPECT_NE(0, validate_apk_path("/data/app/com.example/dir/dir/dir//file")); } TEST_F(UtilsTest, ValidateApkPathSubdirs) { EXPECT_EQ(0, validate_apk_path_subdirs("/data/app/com.example")); EXPECT_EQ(0, validate_apk_path_subdirs("/data/app/com.example/file")); EXPECT_EQ(0, validate_apk_path_subdirs("/data/app/com.example//file")); EXPECT_EQ(0, validate_apk_path_subdirs("/data/app/com.example/dir/")); EXPECT_EQ(0, validate_apk_path_subdirs("/data/app/com.example/dir/file")); EXPECT_EQ(0, validate_apk_path_subdirs("/data/app/com.example/dir/dir/file")); EXPECT_EQ(0, validate_apk_path_subdirs("/data/app/com.example/dir/dir//file")); EXPECT_NE(0, validate_apk_path_subdirs("/data/app/com.example/dir/dir/dir/file")); EXPECT_NE(0, validate_apk_path_subdirs("/data/app/com.example/dir/dir/dir//file")); } } // namespace installd } // namespace installd } // namespace android } // namespace android cmds/installd/utils.cpp +5 −2 Original line number Original line Diff line number Diff line Loading @@ -756,9 +756,12 @@ static int validate_path(const std::string& dir, const std::string& path, int ma auto pos = path.find('/', dir.size()); auto pos = path.find('/', dir.size()); int count = 0; int count = 0; while (pos != std::string::npos) { while (pos != std::string::npos) { pos = path.find('/', pos + 1); auto next = path.find('/', pos + 1); if (next > pos + 1) { count++; count++; } } pos = next; } if (count > maxSubdirs) { if (count > maxSubdirs) { LOG(ERROR) << "Invalid path depth " << path << " when tested against " << dir; LOG(ERROR) << "Invalid path depth " << path << " when tested against " << dir; Loading Loading
cmds/installd/tests/installd_utils_test.cpp +24 −6 Original line number Original line Diff line number Diff line Loading @@ -168,12 +168,6 @@ TEST_F(UtilsTest, IsValidApkPath_EscapeFail) { << badasec1 << " should be rejected as a invalid path"; << badasec1 << " should be rejected as a invalid path"; } } TEST_F(UtilsTest, IsValidApkPath_DoubleSlashFail) { const char *badasec2 = TEST_ASEC_DIR "com.example.asec//pkg.apk"; EXPECT_EQ(-1, validate_apk_path(badasec2)) << badasec2 << " should be rejected as a invalid path"; } TEST_F(UtilsTest, IsValidApkPath_SubdirEscapeFail) { TEST_F(UtilsTest, IsValidApkPath_SubdirEscapeFail) { const char *badasec3 = TEST_ASEC_DIR "com.example.asec/../../../pkg.apk"; const char *badasec3 = TEST_ASEC_DIR "com.example.asec/../../../pkg.apk"; EXPECT_EQ(-1, validate_apk_path(badasec3)) EXPECT_EQ(-1, validate_apk_path(badasec3)) Loading Loading @@ -451,5 +445,29 @@ TEST_F(UtilsTest, ValidateSecondaryDexFilesPath) { package_name, app_dir_ce_user_10 + "/" + too_long, app_uid_for_user_10, FLAG_STORAGE_CE); package_name, app_dir_ce_user_10 + "/" + too_long, app_uid_for_user_10, FLAG_STORAGE_CE); } } TEST_F(UtilsTest, ValidateApkPath) { EXPECT_EQ(0, validate_apk_path("/data/app/com.example")); EXPECT_EQ(0, validate_apk_path("/data/app/com.example/file")); EXPECT_EQ(0, validate_apk_path("/data/app/com.example//file")); EXPECT_NE(0, validate_apk_path("/data/app/com.example/dir/")); EXPECT_NE(0, validate_apk_path("/data/app/com.example/dir/file")); EXPECT_NE(0, validate_apk_path("/data/app/com.example/dir/dir/file")); EXPECT_NE(0, validate_apk_path("/data/app/com.example/dir/dir//file")); EXPECT_NE(0, validate_apk_path("/data/app/com.example/dir/dir/dir/file")); EXPECT_NE(0, validate_apk_path("/data/app/com.example/dir/dir/dir//file")); } TEST_F(UtilsTest, ValidateApkPathSubdirs) { EXPECT_EQ(0, validate_apk_path_subdirs("/data/app/com.example")); EXPECT_EQ(0, validate_apk_path_subdirs("/data/app/com.example/file")); EXPECT_EQ(0, validate_apk_path_subdirs("/data/app/com.example//file")); EXPECT_EQ(0, validate_apk_path_subdirs("/data/app/com.example/dir/")); EXPECT_EQ(0, validate_apk_path_subdirs("/data/app/com.example/dir/file")); EXPECT_EQ(0, validate_apk_path_subdirs("/data/app/com.example/dir/dir/file")); EXPECT_EQ(0, validate_apk_path_subdirs("/data/app/com.example/dir/dir//file")); EXPECT_NE(0, validate_apk_path_subdirs("/data/app/com.example/dir/dir/dir/file")); EXPECT_NE(0, validate_apk_path_subdirs("/data/app/com.example/dir/dir/dir//file")); } } // namespace installd } // namespace installd } // namespace android } // namespace android
cmds/installd/utils.cpp +5 −2 Original line number Original line Diff line number Diff line Loading @@ -756,9 +756,12 @@ static int validate_path(const std::string& dir, const std::string& path, int ma auto pos = path.find('/', dir.size()); auto pos = path.find('/', dir.size()); int count = 0; int count = 0; while (pos != std::string::npos) { while (pos != std::string::npos) { pos = path.find('/', pos + 1); auto next = path.find('/', pos + 1); if (next > pos + 1) { count++; count++; } } pos = next; } if (count > maxSubdirs) { if (count > maxSubdirs) { LOG(ERROR) << "Invalid path depth " << path << " when tested against " << dir; LOG(ERROR) << "Invalid path depth " << path << " when tested against " << dir; Loading