diff --git a/modules/common/appspawn_encaps.c b/modules/common/appspawn_encaps.c index 1d417e1debe68868270ade5ff5ce18fc44ffa96c..6e22442c8386d04d5617da18ac5d4c8228ffaa90 100644 --- a/modules/common/appspawn_encaps.c +++ b/modules/common/appspawn_encaps.c @@ -77,7 +77,7 @@ APPSPAWN_STATIC int WriteEncapsInfo(int fd, AppSpawnEncapsBaseType encapsType, c break; } if (ret != 0) { - APPSPAWN_LOGE("Encaps the setup failed ret: %{public}d fd: %{public}d", ret, fd); + APPSPAWN_LOGE("Encaps the setup failed ret: %{public}d errno: %{public}d fd: %{public}d", ret, errno, fd); return ret; } return 0; @@ -283,35 +283,40 @@ APPSPAWN_STATIC int AddPermissionItemToEncapsInfo(UserEncap *encap, cJSON *permi return 0; } -APPSPAWN_STATIC int AddMembersToEncapsInfo(cJSON *extInfoJson, UserEncaps *encapsInfo) +APPSPAWN_STATIC cJSON *GetEncapsPermissions(cJSON *extInfoJson, int *count) { + APPSPAWN_CHECK_LOGV(extInfoJson != NULL, return NULL, "Invalid extInfoJson"); + // Get ohos.encaps.count cJSON *countJson = cJSON_GetObjectItem(extInfoJson, APP_OHOS_ENCAPS_COUNT_KEY); - APPSPAWN_CHECK(countJson != NULL && cJSON_IsNumber(countJson), return APPSPAWN_ARG_INVALID, "Invalid countJson"); + APPSPAWN_CHECK(countJson != NULL && cJSON_IsNumber(countJson), return NULL, "Invalid countJson"); int encapsCount = countJson->valueint; // Check input count and permissions size cJSON *permissionsJson = cJSON_GetObjectItemCaseSensitive(extInfoJson, APP_OHOS_ENCAPS_PERMISSIONS_KEY); - APPSPAWN_CHECK(permissionsJson != NULL && cJSON_IsArray(permissionsJson), return APPSPAWN_ARG_INVALID, - "Invalid permissionsJson"); - int count = cJSON_GetArraySize(permissionsJson); - APPSPAWN_CHECK(count > 0 && count <= OH_ENCAPS_MAX_COUNT && encapsCount == count, return APPSPAWN_ARG_INVALID, - "Invalid args, encaps count: %{public}d, permission count: %{public}d", encapsCount, count); + APPSPAWN_CHECK(permissionsJson != NULL && cJSON_IsArray(permissionsJson), return NULL, "Invalid permissionsJson"); + *count = cJSON_GetArraySize(permissionsJson); + APPSPAWN_CHECK((*count) > 0 && (*count) <= OH_ENCAPS_MAX_COUNT && encapsCount == (*count), *count = 0; + return NULL, "Invalid args, encaps count: %{public}d, permission count: %{public}d", encapsCount, *count); + + return permissionsJson; +} - encapsInfo->encap = (UserEncap *)calloc(count + 1, sizeof(UserEncap)); - APPSPAWN_CHECK(encapsInfo->encap != NULL, return APPSPAWN_SYSTEM_ERROR, "Failed to calloc encap"); +APPSPAWN_STATIC int AddMembersToEncapsInfo(cJSON *permissionsJson, UserEncaps *encapsInfo, int count) +{ + APPSPAWN_CHECK_LOGV(permissionsJson != NULL, return 0, "Encaps not contains valid permissionsJson"); for (int i = 0; i < count; i++) { cJSON *permission = cJSON_GetArrayItem(permissionsJson, i); APPSPAWN_CHECK(permission != NULL, return APPSPAWN_ERROR_UTILS_DECODE_JSON_FAIL, - "Encaps get single permission failed") + "Encaps get single permission failed index %{public}d", i); cJSON *permissionItem = permission->child; APPSPAWN_CHECK(permissionItem != NULL, return APPSPAWN_ERROR_UTILS_DECODE_JSON_FAIL, - "Encaps get permission item failed") + "Encaps get permission item failed index %{public}d", i); if (AddPermissionItemToEncapsInfo(&encapsInfo->encap[i], permissionItem) != 0) { - APPSPAWN_LOGE("Add permission to encap failed"); + APPSPAWN_LOGE("Add permission to encap failed index %{public}d", i); return APPSPAWN_ERROR_UTILS_ADD_JSON_FAIL; } encapsInfo->encapsCount++; @@ -344,7 +349,7 @@ static int SpawnSetMaxPids(AppSpawningCtx *property, UserEncaps *encapsInfo) maxPidCount = SpawnGetMaxPids(property); } - APPSPAWN_CHECK(maxPidCount > 0 && maxPidCount < OH_APP_MAX_PIDS_NUM, return 0, + APPSPAWN_CHECK_LOGV(maxPidCount > 0 && maxPidCount < OH_APP_MAX_PIDS_NUM, return 0, "Don't need to set pid max count %{public}u. Use default pid max", maxPidCount); APPSPAWN_CHECK(encapsInfo->encapsCount < OH_ENCAPS_MAX_COUNT, return APPSPAWN_ARG_INVALID, "Encaps count is more than 64, cannot set permissions"); @@ -357,31 +362,35 @@ static int SpawnSetMaxPids(AppSpawningCtx *property, UserEncaps *encapsInfo) encapsInfo->encap[count].valueLen = sizeof(maxPidCount); encapsInfo->encap[count].type = ENCAPS_INT; encapsInfo->encapsCount++; + APPSPAWN_LOGV("Set max fork count: %{public}u, encapsCount: %{public}u", maxPidCount, encapsInfo->encapsCount); return 0; } APPSPAWN_STATIC int SpawnSetPermissions(AppSpawningCtx *property, UserEncaps *encapsInfo) { // Get Permissions obejct + int count = 0; cJSON *extInfoJson = GetJsonObjFromExtInfo(property, MSG_EXT_NAME_JIT_PERMISSIONS); - if (extInfoJson == NULL) { - APPSPAWN_LOGV("GetJsonObjFromExtInfo failed"); - return APPSPAWN_ARG_INVALID; - } + cJSON *permissionsJson = GetEncapsPermissions(extInfoJson, &count); + APPSPAWN_CHECK_LOGW(count >= 0 && count <= OH_ENCAPS_MAX_COUNT, count = 0, "Invalid count: %{public}d", count); - int ret = AddMembersToEncapsInfo(extInfoJson, encapsInfo); - if (ret != 0) { - APPSPAWN_LOGW("Add member to encaps failed, ret: %{public}d", ret); - cJSON_Delete(extInfoJson); - return ret; - } + int ret = 0; + do { + encapsInfo->encap = (UserEncap *)calloc(count + 1, sizeof(UserEncap)); + APPSPAWN_CHECK(encapsInfo->encap != NULL, ret = APPSPAWN_SYSTEM_ERROR; + break, "Failed to calloc encap"); + + ret = AddMembersToEncapsInfo(permissionsJson, encapsInfo, count); + if (ret != 0) { + APPSPAWN_LOGW("Add member to encaps failed, ret: %{public}d", ret); + } - ret = SpawnSetMaxPids(property, encapsInfo); - APPSPAWN_CHECK(ret == 0, cJSON_Delete(extInfoJson); - return ret, "Set max pids count to encaps failed"); + ret = SpawnSetMaxPids(property, encapsInfo); + APPSPAWN_CHECK(ret == 0, break, "Set max fork count to encaps failed, ret: %{public}d", ret); + } while (0); - cJSON_Delete(extInfoJson); - return 0; + APPSPAWN_ONLY_EXPER(extInfoJson != NULL, cJSON_Delete(extInfoJson)); + return ret; } APPSPAWN_STATIC int SpawnSetEncapsPermissions(AppSpawnMgr *content, AppSpawningCtx *property) @@ -415,8 +424,10 @@ APPSPAWN_STATIC int SpawnSetEncapsPermissions(AppSpawnMgr *content, AppSpawningC return 0; // Can't set permission encpas ability } - (void)WriteEncapsInfo(encapsFileFd, ENCAPS_PERMISSION_TYPE_MODE, &encapsInfo, OH_ENCAPS_DEFAULT_FLAG); - APPSPAWN_LOGV("Set encaps info finish"); + if (encapsInfo.encapsCount > 0) { + (void)WriteEncapsInfo(encapsFileFd, ENCAPS_PERMISSION_TYPE_MODE, &encapsInfo, OH_ENCAPS_DEFAULT_FLAG); + APPSPAWN_LOGV("Set encaps info finish, encapsCount: %{public}u", encapsInfo.encapsCount); + } FreeEncapsInfo(&encapsInfo); close(encapsFileFd); diff --git a/test/mock/app_spawn_stub.h b/test/mock/app_spawn_stub.h index 5abe32760896ef46cc6b547f81a4c3accd6e16ae..3d4e12ef248d10c3a753b93f1fba0dd850ba53b8 100644 --- a/test/mock/app_spawn_stub.h +++ b/test/mock/app_spawn_stub.h @@ -136,7 +136,8 @@ void SetSystemEnv(void); void RunAppSandbox(const char *ptyName); HOOK_MGR *GetAppSpawnHookMgr(void); int SpawnKickDogStart(AppSpawnMgr *mgrContent); -int AddMembersToEncapsInfo(cJSON *extInfoJson, UserEncaps *encapsInfo); +cJSON *GetEncapsPermissions(cJSON *extInfoJson, int *count); +int AddMembersToEncapsInfo(cJSON *extInfoJson, UserEncaps *encapsInfo, int count); int SpawnSetPermissions(AppSpawningCtx *property, UserEncaps *encapsInfo); int AddPermissionItemToEncapsInfo(UserEncap *encap, cJSON *permissionItem); void FreeEncapsInfo(UserEncaps *encapsInfo); diff --git a/test/unittest/app_spawn_standard_test/app_spawn_common_test.cpp b/test/unittest/app_spawn_standard_test/app_spawn_common_test.cpp index 266cb7beae1c362dcfa3a8b6c408db3199bafdce..3f6a4f11527d35692c09ab25fc4df82132da9219 100644 --- a/test/unittest/app_spawn_standard_test/app_spawn_common_test.cpp +++ b/test/unittest/app_spawn_standard_test/app_spawn_common_test.cpp @@ -775,7 +775,8 @@ HWTEST_F(AppSpawnCommonTest, App_Spawn_Encaps_003, TestSize.Level0) ret = SpawnSetPermissions(property, &encapsInfo); } while (0); - EXPECT_EQ(ret, APPSPAWN_ARG_INVALID); + EXPECT_EQ(ret, 0); + EXPECT_EQ(encapsInfo.encapsCount, 0); DeleteAppSpawningCtx(property); AppSpawnClientDestroy(clientHandle); FreeEncapsInfo(&encapsInfo); @@ -815,8 +816,8 @@ HWTEST_F(AppSpawnCommonTest, App_Spawn_Encaps_004, TestSize.Level0) HWTEST_F(AppSpawnCommonTest, App_Spawn_Encaps_005, TestSize.Level0) { UserEncaps encapsInfo = {0}; - int ret = AddMembersToEncapsInfo(NULL, &encapsInfo); - EXPECT_EQ(ret, APPSPAWN_ARG_INVALID); + int ret = AddMembersToEncapsInfo(NULL, &encapsInfo, 0); + EXPECT_EQ(ret, 0); } HWTEST_F(AppSpawnCommonTest, App_Spawn_Encaps_006, TestSize.Level0) @@ -827,16 +828,12 @@ HWTEST_F(AppSpawnCommonTest, App_Spawn_Encaps_006, TestSize.Level0) cJSON *encapsJson = cJSON_Parse(encapsJsonStr); EXPECT_NE(encapsJson, nullptr); - cJSON *permissions = cJSON_GetObjectItemCaseSensitive(encapsJson, "permissions"); - EXPECT_NE(permissions, nullptr); - cJSON *emptyItem = cJSON_CreateObject(); - EXPECT_TRUE(cJSON_AddItemToArray(permissions, emptyItem)); - UserEncaps encapsInfo = {0}; - int ret = AddMembersToEncapsInfo(encapsJson, &encapsInfo); - EXPECT_EQ(ret, APPSPAWN_ERROR_UTILS_DECODE_JSON_FAIL); + int count = 0; + cJSON *permissions = GetEncapsPermissions(encapsJson, &count); + EXPECT_EQ(permissions, nullptr); + EXPECT_EQ(count, 0); cJSON_Delete(encapsJson); - FreeEncapsInfo(&encapsInfo); } HWTEST_F(AppSpawnCommonTest, App_Spawn_Encaps_007, TestSize.Level0) @@ -847,9 +844,17 @@ HWTEST_F(AppSpawnCommonTest, App_Spawn_Encaps_007, TestSize.Level0) cJSON *encapsJson = cJSON_Parse(encapsJsonStr); EXPECT_NE(encapsJson, nullptr); + int count = 0; + cJSON *permissions = GetEncapsPermissions(encapsJson, &count); + EXPECT_NE(permissions, nullptr); + EXPECT_EQ(count, 4); + UserEncaps encapsInfo = {0}; - int ret = AddMembersToEncapsInfo(encapsJson, &encapsInfo); + encapsInfo.encap = (UserEncap *)calloc(count, sizeof(UserEncap)); + EXPECT_NE(encapsInfo.encap, nullptr); + int ret = AddMembersToEncapsInfo(permissions, &encapsInfo, count); EXPECT_EQ(ret, APPSPAWN_ERROR_UTILS_ADD_JSON_FAIL); + EXPECT_EQ(encapsInfo.encapsCount, 3); cJSON_Delete(encapsJson); FreeEncapsInfo(&encapsInfo); @@ -1062,12 +1067,12 @@ HWTEST_F(AppSpawnCommonTest, App_Spawn_Encaps_019, TestSize.Level0) cJSON *encapsJson = cJSON_Parse(encapsJsonStr); EXPECT_NE(encapsJson, nullptr); - UserEncaps encapsInfo = {0}; - int ret = AddMembersToEncapsInfo(encapsJson, &encapsInfo); - EXPECT_EQ(ret, APPSPAWN_ARG_INVALID); + int count = 0; + cJSON *permissions = GetEncapsPermissions(encapsJson, &count); + EXPECT_EQ(permissions, nullptr); + EXPECT_EQ(count, 0); cJSON_Delete(encapsJson); - FreeEncapsInfo(&encapsInfo); } HWTEST_F(AppSpawnCommonTest, App_Spawn_Encaps_020, TestSize.Level0) @@ -1079,12 +1084,12 @@ HWTEST_F(AppSpawnCommonTest, App_Spawn_Encaps_020, TestSize.Level0) cJSON *encapsJson = cJSON_Parse(encapsJsonStr); EXPECT_NE(encapsJson, nullptr); - UserEncaps encapsInfo = {0}; - int ret = AddMembersToEncapsInfo(encapsJson, &encapsInfo); - EXPECT_EQ(ret, APPSPAWN_ARG_INVALID); + int count = 0; + cJSON *permissions = GetEncapsPermissions(encapsJson, &count); + EXPECT_EQ(permissions, nullptr); + EXPECT_EQ(count, 0); cJSON_Delete(encapsJson); - FreeEncapsInfo(&encapsInfo); } HWTEST_F(AppSpawnCommonTest, App_Spawn_Encaps_021, TestSize.Level0) @@ -1225,12 +1230,12 @@ HWTEST_F(AppSpawnCommonTest, App_Spawn_Encaps_029, TestSize.Level0) cJSON *encapsJson = cJSON_Parse(encapsJsonStr); EXPECT_NE(encapsJson, nullptr); - UserEncaps encapsInfo = {0}; - int ret = AddMembersToEncapsInfo(encapsJson, &encapsInfo); - EXPECT_EQ(ret, APPSPAWN_ARG_INVALID); + int count = 0; + cJSON *permissions = GetEncapsPermissions(encapsJson, &count); + EXPECT_EQ(permissions, nullptr); + EXPECT_EQ(count, 0); cJSON_Delete(encapsJson); - FreeEncapsInfo(&encapsInfo); } HWTEST_F(AppSpawnCommonTest, App_Spawn_Encaps_030, TestSize.Level0)