1d9f0492fSopenharmony_ci/* 2d9f0492fSopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd. 3d9f0492fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4d9f0492fSopenharmony_ci * you may not use this file except in compliance with the License. 5d9f0492fSopenharmony_ci * You may obtain a copy of the License at 6d9f0492fSopenharmony_ci * 7d9f0492fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8d9f0492fSopenharmony_ci * 9d9f0492fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10d9f0492fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11d9f0492fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12d9f0492fSopenharmony_ci * See the License for the specific language governing permissions and 13d9f0492fSopenharmony_ci * limitations under the License. 14d9f0492fSopenharmony_ci */ 15d9f0492fSopenharmony_ci 16d9f0492fSopenharmony_ci#include "param_stub.h" 17d9f0492fSopenharmony_ci#include <dirent.h> 18d9f0492fSopenharmony_ci#include <sys/prctl.h> 19d9f0492fSopenharmony_ci#include <unistd.h> 20d9f0492fSopenharmony_ci 21d9f0492fSopenharmony_ci#include "begetctl.h" 22d9f0492fSopenharmony_ci#include "bootstage.h" 23d9f0492fSopenharmony_ci#include "init.h" 24d9f0492fSopenharmony_ci#include "init_log.h" 25d9f0492fSopenharmony_ci#include "init_param.h" 26d9f0492fSopenharmony_ci#ifndef OHOS_LITE 27d9f0492fSopenharmony_ci#include "init_mount.h" 28d9f0492fSopenharmony_ci#endif 29d9f0492fSopenharmony_ci#include "hookmgr.h" 30d9f0492fSopenharmony_ci#include "parameter.h" 31d9f0492fSopenharmony_ci#include "param_manager.h" 32d9f0492fSopenharmony_ci#include "param_security.h" 33d9f0492fSopenharmony_ci#include "param_utils.h" 34d9f0492fSopenharmony_ci#include "init_group_manager.h" 35d9f0492fSopenharmony_ci#include "init_module_engine.h" 36d9f0492fSopenharmony_ci#ifdef PARAM_LOAD_CFG_FROM_CODE 37d9f0492fSopenharmony_ci#include "param_cfg.h" 38d9f0492fSopenharmony_ci#endif 39d9f0492fSopenharmony_ci#include "ueventd.h" 40d9f0492fSopenharmony_ci 41d9f0492fSopenharmony_ci#ifdef __cplusplus 42d9f0492fSopenharmony_ci#if __cplusplus 43d9f0492fSopenharmony_ciextern "C" { 44d9f0492fSopenharmony_ci#endif 45d9f0492fSopenharmony_ci#endif 46d9f0492fSopenharmony_ci 47d9f0492fSopenharmony_cistatic int g_stubResult[STUB_MAX] = { 0 }; 48d9f0492fSopenharmony_cistatic int g_testRandom = 2; // 2 is test random 49d9f0492fSopenharmony_ci 50d9f0492fSopenharmony_cistatic int g_testPermissionResult = DAC_RESULT_PERMISSION; 51d9f0492fSopenharmony_civoid SetTestPermissionResult(int result) 52d9f0492fSopenharmony_ci{ 53d9f0492fSopenharmony_ci g_testPermissionResult = result; 54d9f0492fSopenharmony_ci} 55d9f0492fSopenharmony_ci 56d9f0492fSopenharmony_cistatic const char *selinuxLabels[][2] = { 57d9f0492fSopenharmony_ci {"test.permission.read", "u:object_r:test_read:s0"}, 58d9f0492fSopenharmony_ci {"test.permission.write", "u:object_r:test_write:s0"}, 59d9f0492fSopenharmony_ci {"test.permission.watch", "u:object_r:test_watch:s0"}, 60d9f0492fSopenharmony_ci}; 61d9f0492fSopenharmony_ci 62d9f0492fSopenharmony_cistatic int TestGenHashCode(const char *buff) 63d9f0492fSopenharmony_ci{ 64d9f0492fSopenharmony_ci int code = 0; 65d9f0492fSopenharmony_ci size_t buffLen = strlen(buff); 66d9f0492fSopenharmony_ci for (size_t i = 0; i < buffLen; i++) { 67d9f0492fSopenharmony_ci code += buff[i] - 'A'; 68d9f0492fSopenharmony_ci } 69d9f0492fSopenharmony_ci return code; 70d9f0492fSopenharmony_ci} 71d9f0492fSopenharmony_ci 72d9f0492fSopenharmony_cistatic void TestSetSelinuxLogCallback(void) {} 73d9f0492fSopenharmony_ci 74d9f0492fSopenharmony_cistatic int TestSetParamCheck(const char *paraName, const char *context, const SrcInfo *info) 75d9f0492fSopenharmony_ci{ 76d9f0492fSopenharmony_ci BEGET_LOGI("TestSetParamCheck %s result %d", paraName, g_testPermissionResult); 77d9f0492fSopenharmony_ci return g_testPermissionResult; 78d9f0492fSopenharmony_ci} 79d9f0492fSopenharmony_ci 80d9f0492fSopenharmony_cistatic const char *TestGetParamLabel(const char *paraName) 81d9f0492fSopenharmony_ci{ 82d9f0492fSopenharmony_ci BEGET_LOGI("TestGetParamLabel %s", paraName); 83d9f0492fSopenharmony_ci if (paraName == nullptr) { 84d9f0492fSopenharmony_ci return nullptr; 85d9f0492fSopenharmony_ci } 86d9f0492fSopenharmony_ci for (size_t i = 0; i < ARRAY_LENGTH(selinuxLabels); i++) { 87d9f0492fSopenharmony_ci if (strncmp(selinuxLabels[i][0], paraName, strlen(selinuxLabels[i][0])) == 0) { 88d9f0492fSopenharmony_ci return selinuxLabels[i][1]; 89d9f0492fSopenharmony_ci } 90d9f0492fSopenharmony_ci } 91d9f0492fSopenharmony_ci int code = TestGenHashCode(paraName); 92d9f0492fSopenharmony_ci code = code % (ARRAY_LENGTH(selinuxLabels)); 93d9f0492fSopenharmony_ci return selinuxLabels[code][1]; 94d9f0492fSopenharmony_ci} 95d9f0492fSopenharmony_ci 96d9f0492fSopenharmony_cistatic int32_t TestGetSelinuxLabelIndex(const char *paraName) 97d9f0492fSopenharmony_ci{ 98d9f0492fSopenharmony_ci for (size_t i = 0; i < ARRAY_LENGTH(selinuxLabels); i++) { 99d9f0492fSopenharmony_ci if (strncmp(selinuxLabels[i][0], paraName, strlen(selinuxLabels[i][0])) == 0) { 100d9f0492fSopenharmony_ci return i; 101d9f0492fSopenharmony_ci } 102d9f0492fSopenharmony_ci } 103d9f0492fSopenharmony_ci int code = TestGenHashCode(paraName); 104d9f0492fSopenharmony_ci code = code % (ARRAY_LENGTH(selinuxLabels)); 105d9f0492fSopenharmony_ci return code; 106d9f0492fSopenharmony_ci} 107d9f0492fSopenharmony_ci 108d9f0492fSopenharmony_cistatic const char *g_forbidReadParamName[] = { 109d9f0492fSopenharmony_ci "ohos.servicectrl.", 110d9f0492fSopenharmony_ci // "test.permission.write", 111d9f0492fSopenharmony_ci}; 112d9f0492fSopenharmony_cistatic int TestReadParamCheck(const char *paraName) 113d9f0492fSopenharmony_ci{ 114d9f0492fSopenharmony_ci // forbid to read ohos.servicectrl. 115d9f0492fSopenharmony_ci for (size_t i = 0; i < ARRAY_LENGTH(g_forbidReadParamName); i++) { 116d9f0492fSopenharmony_ci if (strncmp(paraName, g_forbidReadParamName[i], strlen(g_forbidReadParamName[i])) == 0) { 117d9f0492fSopenharmony_ci return 1; 118d9f0492fSopenharmony_ci } 119d9f0492fSopenharmony_ci } 120d9f0492fSopenharmony_ci return g_testPermissionResult; 121d9f0492fSopenharmony_ci} 122d9f0492fSopenharmony_cistatic void TestDestroyParamList(ParamContextsList **list) 123d9f0492fSopenharmony_ci{ 124d9f0492fSopenharmony_ci#ifdef PARAM_SUPPORT_SELINUX 125d9f0492fSopenharmony_ci ParamContextsList *head = *list; 126d9f0492fSopenharmony_ci while (head != nullptr) { 127d9f0492fSopenharmony_ci ParamContextsList *next = head->next; 128d9f0492fSopenharmony_ci free((void *)head->info.paraName); 129d9f0492fSopenharmony_ci free((void *)head->info.paraContext); 130d9f0492fSopenharmony_ci free(head); 131d9f0492fSopenharmony_ci head = next; 132d9f0492fSopenharmony_ci } 133d9f0492fSopenharmony_ci#endif 134d9f0492fSopenharmony_ci} 135d9f0492fSopenharmony_cistatic ParamContextsList *TestGetParamList(void) 136d9f0492fSopenharmony_ci{ 137d9f0492fSopenharmony_ci#ifdef PARAM_SUPPORT_SELINUX 138d9f0492fSopenharmony_ci ParamContextsList *head = (ParamContextsList *)malloc(sizeof(ParamContextsList)); 139d9f0492fSopenharmony_ci BEGET_ERROR_CHECK(head != nullptr, return nullptr, "Failed to alloc ParamContextsList"); 140d9f0492fSopenharmony_ci head->info.paraName = strdup(selinuxLabels[0][0]); 141d9f0492fSopenharmony_ci head->info.paraContext = strdup(selinuxLabels[0][1]); 142d9f0492fSopenharmony_ci head->info.index = 0; 143d9f0492fSopenharmony_ci head->next = nullptr; 144d9f0492fSopenharmony_ci for (size_t i = 1; i < ARRAY_LENGTH(selinuxLabels); i++) { 145d9f0492fSopenharmony_ci ParamContextsList *node = (ParamContextsList *)malloc(sizeof(ParamContextsList)); 146d9f0492fSopenharmony_ci BEGET_ERROR_CHECK(node != nullptr, TestDestroyParamList(&head); 147d9f0492fSopenharmony_ci return nullptr, "Failed to alloc ParamContextsList"); 148d9f0492fSopenharmony_ci node->info.paraName = strdup(selinuxLabels[i][0]); 149d9f0492fSopenharmony_ci node->info.paraContext = strdup(selinuxLabels[i][1]); 150d9f0492fSopenharmony_ci node->info.index = i; 151d9f0492fSopenharmony_ci node->next = head->next; 152d9f0492fSopenharmony_ci head->next = node; 153d9f0492fSopenharmony_ci } 154d9f0492fSopenharmony_ci // test error, no node paraName 155d9f0492fSopenharmony_ci ParamContextsList *node = (ParamContextsList *)malloc(sizeof(ParamContextsList)); 156d9f0492fSopenharmony_ci BEGET_ERROR_CHECK(node != nullptr, TestDestroyParamList(&head); 157d9f0492fSopenharmony_ci return nullptr, "Failed to alloc ParamContextsList"); 158d9f0492fSopenharmony_ci node->info.paraName = nullptr; 159d9f0492fSopenharmony_ci node->info.paraContext = strdup(selinuxLabels[0][1]); 160d9f0492fSopenharmony_ci node->next = head->next; 161d9f0492fSopenharmony_ci head->next = node; 162d9f0492fSopenharmony_ci 163d9f0492fSopenharmony_ci // test error, no node paraContext 164d9f0492fSopenharmony_ci node = (ParamContextsList *)malloc(sizeof(ParamContextsList)); 165d9f0492fSopenharmony_ci BEGET_ERROR_CHECK(node != nullptr, TestDestroyParamList(&head); 166d9f0492fSopenharmony_ci return nullptr, "Failed to alloc ParamContextsList"); 167d9f0492fSopenharmony_ci node->info.paraName = strdup(selinuxLabels[0][0]); 168d9f0492fSopenharmony_ci node->info.paraContext = nullptr; 169d9f0492fSopenharmony_ci node->next = head->next; 170d9f0492fSopenharmony_ci head->next = node; 171d9f0492fSopenharmony_ci 172d9f0492fSopenharmony_ci // test error, repeat 173d9f0492fSopenharmony_ci node = (ParamContextsList *)malloc(sizeof(ParamContextsList)); 174d9f0492fSopenharmony_ci BEGET_ERROR_CHECK(node != nullptr, TestDestroyParamList(&head); 175d9f0492fSopenharmony_ci return nullptr, "Failed to alloc ParamContextsList"); 176d9f0492fSopenharmony_ci node->info.paraName = strdup(selinuxLabels[0][0]); 177d9f0492fSopenharmony_ci node->info.paraContext = strdup(selinuxLabels[0][1]); 178d9f0492fSopenharmony_ci node->info.index = 0; 179d9f0492fSopenharmony_ci node->next = head->next; 180d9f0492fSopenharmony_ci head->next = node; 181d9f0492fSopenharmony_ci return head; 182d9f0492fSopenharmony_ci#else 183d9f0492fSopenharmony_ci return nullptr; 184d9f0492fSopenharmony_ci#endif 185d9f0492fSopenharmony_ci} 186d9f0492fSopenharmony_ci 187d9f0492fSopenharmony_civoid TestSetSelinuxOps(void) 188d9f0492fSopenharmony_ci{ 189d9f0492fSopenharmony_ci#ifdef PARAM_SUPPORT_SELINUX 190d9f0492fSopenharmony_ci SelinuxSpace *selinuxSpace = &GetParamWorkSpace()->selinuxSpace; 191d9f0492fSopenharmony_ci selinuxSpace->setSelinuxLogCallback = TestSetSelinuxLogCallback; 192d9f0492fSopenharmony_ci selinuxSpace->setParamCheck = TestSetParamCheck; 193d9f0492fSopenharmony_ci selinuxSpace->getParamLabel = TestGetParamLabel; 194d9f0492fSopenharmony_ci selinuxSpace->readParamCheck = TestReadParamCheck; 195d9f0492fSopenharmony_ci selinuxSpace->getParamList = TestGetParamList; 196d9f0492fSopenharmony_ci selinuxSpace->destroyParamList = TestDestroyParamList; 197d9f0492fSopenharmony_ci selinuxSpace->getParamLabelIndex = TestGetSelinuxLabelIndex; 198d9f0492fSopenharmony_ci#endif 199d9f0492fSopenharmony_ci} 200d9f0492fSopenharmony_ci 201d9f0492fSopenharmony_civoid TestSetParamCheckResult(const char *prefix, uint16_t mode, int result) 202d9f0492fSopenharmony_ci{ 203d9f0492fSopenharmony_ci ParamAuditData auditData = {}; 204d9f0492fSopenharmony_ci auditData.name = prefix; 205d9f0492fSopenharmony_ci auditData.dacData.gid = 202; // 202 test dac gid 206d9f0492fSopenharmony_ci auditData.dacData.uid = 202; // 202 test dac uid 207d9f0492fSopenharmony_ci auditData.dacData.mode = mode; 208d9f0492fSopenharmony_ci AddSecurityLabel(&auditData); 209d9f0492fSopenharmony_ci SetTestPermissionResult(result); 210d9f0492fSopenharmony_ci} 211d9f0492fSopenharmony_ci 212d9f0492fSopenharmony_civoid CreateTestFile(const char *fileName, const char *data) 213d9f0492fSopenharmony_ci{ 214d9f0492fSopenharmony_ci CheckAndCreateDir(fileName); 215d9f0492fSopenharmony_ci PARAM_LOGV("PrepareParamTestData for %s", fileName); 216d9f0492fSopenharmony_ci FILE *tmpFile = fopen(fileName, "wr"); 217d9f0492fSopenharmony_ci if (tmpFile != nullptr) { 218d9f0492fSopenharmony_ci fprintf(tmpFile, "%s", data); 219d9f0492fSopenharmony_ci (void)fflush(tmpFile); 220d9f0492fSopenharmony_ci fclose(tmpFile); 221d9f0492fSopenharmony_ci } 222d9f0492fSopenharmony_ci} 223d9f0492fSopenharmony_cistatic void PrepareUeventdcfg(void) 224d9f0492fSopenharmony_ci{ 225d9f0492fSopenharmony_ci const char *ueventdcfg = "[device]\n" 226d9f0492fSopenharmony_ci "/dev/test 0666 1000 1000\n" 227d9f0492fSopenharmony_ci "[device]\n" 228d9f0492fSopenharmony_ci "/dev/test1 0666 1000\n" 229d9f0492fSopenharmony_ci "[device]\n" 230d9f0492fSopenharmony_ci "/dev/test2 0666 1000 1000 1000 1000\n" 231d9f0492fSopenharmony_ci "[sysfs]\n" 232d9f0492fSopenharmony_ci "/dir/to/nothing attr_nowhere 0666 1000 1000\n" 233d9f0492fSopenharmony_ci "[sysfs]\n" 234d9f0492fSopenharmony_ci " #/dir/to/nothing attr_nowhere 0666\n" 235d9f0492fSopenharmony_ci "[sysfs\n" 236d9f0492fSopenharmony_ci "/dir/to/nothing attr_nowhere 0666\n" 237d9f0492fSopenharmony_ci "[firmware]\n" 238d9f0492fSopenharmony_ci "/etc\n" 239d9f0492fSopenharmony_ci "[device]\n" 240d9f0492fSopenharmony_ci "/dev/testbinder 0666 1000 1000 const.dev.binder\n" 241d9f0492fSopenharmony_ci "[device]\n" 242d9f0492fSopenharmony_ci "/dev/testbinder1 0666 1000 1000 const.dev.binder\n" 243d9f0492fSopenharmony_ci "[device]\n" 244d9f0492fSopenharmony_ci "/dev/testbinder2 0666 1000 1000 const.dev.binder\n" 245d9f0492fSopenharmony_ci "[device]\n" 246d9f0492fSopenharmony_ci "/dev/testbinder3 0666 1000 1000 const.dev.binder\n"; 247d9f0492fSopenharmony_ci mkdir("/data/ueventd_ut", S_IRWXU | S_IRWXG | S_IRWXO); 248d9f0492fSopenharmony_ci CreateTestFile(STARTUP_INIT_UT_PATH"/ueventd_ut/valid.config", ueventdcfg); 249d9f0492fSopenharmony_ci} 250d9f0492fSopenharmony_cistatic void PrepareModCfg(void) 251d9f0492fSopenharmony_ci{ 252d9f0492fSopenharmony_ci const char *modCfg = "testinsmod"; 253d9f0492fSopenharmony_ci CreateTestFile(STARTUP_INIT_UT_PATH"/test_insmod", modCfg); 254d9f0492fSopenharmony_ci} 255d9f0492fSopenharmony_cistatic void PrepareInnerKitsCfg() 256d9f0492fSopenharmony_ci{ 257d9f0492fSopenharmony_ci const char *innerKitsCfg = "/dev/block/platform/soc/10100000.himci.eMMC/by-name/system /system " 258d9f0492fSopenharmony_ci "ext4 ro,barrier=1 wait\n" 259d9f0492fSopenharmony_ci "/dev/block/platform/soc/10100000.himci.eMMC/by-name/vendor /vendor " 260d9f0492fSopenharmony_ci "ext4 ro,barrier=1 wait\n" 261d9f0492fSopenharmony_ci "/dev/block/platform/soc/10100000.himci.eMMC/by-name/hos " 262d9f0492fSopenharmony_ci "/hos ntfs nosuid,nodev,noatime,barrier=1,data=ordered wait\n" 263d9f0492fSopenharmony_ci "/dev/block/platform/soc/10100000.himci.eMMC/by-name/userdata /data ext4 " 264d9f0492fSopenharmony_ci "nosuid,nodev,noatime,barrier=1,data=ordered,noauto_da_alloc " 265d9f0492fSopenharmony_ci "wait,reservedsize=104857600\n" 266d9f0492fSopenharmony_ci " aaaa\n" 267d9f0492fSopenharmony_ci "aa aa\n" 268d9f0492fSopenharmony_ci "aa aa aa\n" 269d9f0492fSopenharmony_ci "aa aa aa aa\n"; 270d9f0492fSopenharmony_ci const char *fstabRequired = "# fstab file.\n" 271d9f0492fSopenharmony_ci "#<src> <mnt_point> <type> <mnt_flags and options> <fs_mgr_flags>\n" 272d9f0492fSopenharmony_ci "/dev/block/platform/fe310000.sdhci/by-name/testsystem /usr ext4 ro,barrier=1 wait,required,nofail\n" 273d9f0492fSopenharmony_ci "/dev/block/platform/fe310000.sdhci/by-name/testvendor /vendor ext4 ro,barrier=1 wait,required\n" 274d9f0492fSopenharmony_ci "/dev/block/platform/fe310000.sdhci/by-name/testuserdata1 /data f2fs noatime,nosuid,nodev wait,check,quota\n" 275d9f0492fSopenharmony_ci "/dev/block/platform/fe310000.sdhci/by-name/testuserdata2 /data ext4 noatime,fscrypt=xxx wait,check,quota\n" 276d9f0492fSopenharmony_ci "/dev/block/platform/fe310000.sdhci/by-name/testmisc /misc none none wait,required"; 277d9f0492fSopenharmony_ci mkdir("/data/init_ut/mount_unitest/", S_IRWXU | S_IRWXG | S_IRWXO); 278d9f0492fSopenharmony_ci CreateTestFile(STARTUP_INIT_UT_PATH"/mount_unitest/ReadFstabFromFile1.fstable", innerKitsCfg); 279d9f0492fSopenharmony_ci CreateTestFile(STARTUP_INIT_UT_PATH"/etc/fstab.required", fstabRequired); 280d9f0492fSopenharmony_ci CreateTestFile(STARTUP_INIT_UT_PATH"/system/etc/fstab.required", fstabRequired); 281d9f0492fSopenharmony_ci} 282d9f0492fSopenharmony_cistatic void PrepareGroupTestCfg() 283d9f0492fSopenharmony_ci{ 284d9f0492fSopenharmony_ci const char *data = "{" 285d9f0492fSopenharmony_ci "\"jobs\": [\"param:job1\", \"param:job2\", \"param:job4\"]," 286d9f0492fSopenharmony_ci "\"services\": [\"service:service1\", \"service:service3\", \"service:service2\"]," 287d9f0492fSopenharmony_ci "\"groups\": [\"subsystem.xxx1.group\", \"subsystem.xxx2.group\", \"subsystem.xxx4.group\"]" 288d9f0492fSopenharmony_ci "}"; 289d9f0492fSopenharmony_ci const char *xxx1 = "{" 290d9f0492fSopenharmony_ci "\"groups\": [\"subsystem.xxx11.group\"" 291d9f0492fSopenharmony_ci "}"; 292d9f0492fSopenharmony_ci const char *xxx11 = "{" 293d9f0492fSopenharmony_ci "\"groups\": [\"subsystem.xxx12.group\"" 294d9f0492fSopenharmony_ci "}"; 295d9f0492fSopenharmony_ci const char *xxx12 = "{" 296d9f0492fSopenharmony_ci "\"groups\": [\"subsystem.xxx13.group\"" 297d9f0492fSopenharmony_ci "}"; 298d9f0492fSopenharmony_ci const char *xxx13 = "{" 299d9f0492fSopenharmony_ci "\"groups\": [\"subsystem.xxx14.group\"" 300d9f0492fSopenharmony_ci "}"; 301d9f0492fSopenharmony_ci const char *xxx14 = "{" 302d9f0492fSopenharmony_ci "\"groups\": [\"subsystem.xxx11.group\"" 303d9f0492fSopenharmony_ci "}"; 304d9f0492fSopenharmony_ci CreateTestFile(GROUP_DEFAULT_PATH "/device.boot.group.cfg", data); 305d9f0492fSopenharmony_ci CreateTestFile(GROUP_DEFAULT_PATH "/subsystem.xxx1.group.cfg", xxx1); 306d9f0492fSopenharmony_ci CreateTestFile(GROUP_DEFAULT_PATH "/subsystem.xxx11.group.cfg", xxx11); 307d9f0492fSopenharmony_ci CreateTestFile(GROUP_DEFAULT_PATH "/subsystem.xxx12.group.cfg", xxx12); 308d9f0492fSopenharmony_ci CreateTestFile(GROUP_DEFAULT_PATH "/subsystem.xxx13.group.cfg", xxx13); 309d9f0492fSopenharmony_ci CreateTestFile(GROUP_DEFAULT_PATH "/subsystem.xxx14.group.cfg", xxx14); 310d9f0492fSopenharmony_ci} 311d9f0492fSopenharmony_cistatic bool IsDir(const std::string &path) 312d9f0492fSopenharmony_ci{ 313d9f0492fSopenharmony_ci struct stat st {}; 314d9f0492fSopenharmony_ci if (stat(path.c_str(), &st) < 0) { 315d9f0492fSopenharmony_ci return false; 316d9f0492fSopenharmony_ci } 317d9f0492fSopenharmony_ci return S_ISDIR(st.st_mode); 318d9f0492fSopenharmony_ci} 319d9f0492fSopenharmony_cistatic bool DeleteDir(const std::string &path) 320d9f0492fSopenharmony_ci{ 321d9f0492fSopenharmony_ci auto pDir = std::unique_ptr<DIR, decltype(&closedir)>(opendir(path.c_str()), closedir); 322d9f0492fSopenharmony_ci if (pDir == nullptr) { 323d9f0492fSopenharmony_ci return false; 324d9f0492fSopenharmony_ci } 325d9f0492fSopenharmony_ci 326d9f0492fSopenharmony_ci struct dirent *dp = nullptr; 327d9f0492fSopenharmony_ci while ((dp = readdir(pDir.get())) != nullptr) { 328d9f0492fSopenharmony_ci std::string currentName(dp->d_name); 329d9f0492fSopenharmony_ci if (currentName[0] != '.') { 330d9f0492fSopenharmony_ci std::string tmpName(path); 331d9f0492fSopenharmony_ci tmpName.append("/" + currentName); 332d9f0492fSopenharmony_ci if (IsDir(tmpName)) { 333d9f0492fSopenharmony_ci DeleteDir(tmpName); 334d9f0492fSopenharmony_ci } 335d9f0492fSopenharmony_ci remove(tmpName.c_str()); 336d9f0492fSopenharmony_ci } 337d9f0492fSopenharmony_ci } 338d9f0492fSopenharmony_ci if (remove(path.c_str()) != 0) { 339d9f0492fSopenharmony_ci return false; 340d9f0492fSopenharmony_ci } 341d9f0492fSopenharmony_ci return true; 342d9f0492fSopenharmony_ci} 343d9f0492fSopenharmony_cistatic void LoadParamFromCfg(void) 344d9f0492fSopenharmony_ci{ 345d9f0492fSopenharmony_ci#ifdef PARAM_LOAD_CFG_FROM_CODE 346d9f0492fSopenharmony_ci for (size_t i = 0; i < ARRAY_LENGTH(g_paramDefCfgNodes); i++) { 347d9f0492fSopenharmony_ci PARAM_LOGI("InitParamClient name %s = %s", g_paramDefCfgNodes[i].name, g_paramDefCfgNodes[i].value); 348d9f0492fSopenharmony_ci uint32_t dataIndex = 0; 349d9f0492fSopenharmony_ci int ret = WriteParam(g_paramDefCfgNodes[i].name, g_paramDefCfgNodes[i].value, &dataIndex, 0); 350d9f0492fSopenharmony_ci PARAM_CHECK(ret == 0, continue, "Failed to set param %d name %s %s", 351d9f0492fSopenharmony_ci ret, g_paramDefCfgNodes[i].name, g_paramDefCfgNodes[i].value); 352d9f0492fSopenharmony_ci } 353d9f0492fSopenharmony_ci#endif 354d9f0492fSopenharmony_ci} 355d9f0492fSopenharmony_ci 356d9f0492fSopenharmony_cistatic const char *g_triggerData = "{" 357d9f0492fSopenharmony_ci "\"jobs\" : [{" 358d9f0492fSopenharmony_ci " \"name\" : \"early-init\"," 359d9f0492fSopenharmony_ci " \"cmds\" : [" 360d9f0492fSopenharmony_ci " \" write '/proc/sys/kernel/sysrq 0'\"," 361d9f0492fSopenharmony_ci " \" load_persist_params \"," 362d9f0492fSopenharmony_ci " \" load_persist_params \"," 363d9f0492fSopenharmony_ci " \" # load_persist_params \"," 364d9f0492fSopenharmony_ci " \" restorecon /postinstall\"," 365d9f0492fSopenharmony_ci " \"mkdir /acct/uid\"," 366d9f0492fSopenharmony_ci " \"chown root system /dev/memcg/memory.pressure_level\"," 367d9f0492fSopenharmony_ci " \"chmod 0040 /dev/memcg/memory.pressure_level\"," 368d9f0492fSopenharmony_ci " \"mkdir /dev/memcg/apps/ 0755 system system\"," 369d9f0492fSopenharmony_ci " \"mkdir /dev/memcg/system 0550 system system\"," 370d9f0492fSopenharmony_ci " \"start ueventd\"," 371d9f0492fSopenharmony_ci " \"exec_start apexd-bootstrap\"," 372d9f0492fSopenharmony_ci " \"setparam sys.usb.config ${persist.sys.usb.config}\"" 373d9f0492fSopenharmony_ci " ]" 374d9f0492fSopenharmony_ci " }," 375d9f0492fSopenharmony_ci " {" 376d9f0492fSopenharmony_ci " \"name\" : \"param:trigger_test_1\"," 377d9f0492fSopenharmony_ci " \"condition\" : \"test.sys.boot_from_charger_mode=5\"," 378d9f0492fSopenharmony_ci " \"cmds\" : [" 379d9f0492fSopenharmony_ci " \"class_stop charger\"," 380d9f0492fSopenharmony_ci " \"trigger late-init\"" 381d9f0492fSopenharmony_ci " ]" 382d9f0492fSopenharmony_ci " }," 383d9f0492fSopenharmony_ci " {" 384d9f0492fSopenharmony_ci " \"name\" : \"param:trigger_test_2\"," 385d9f0492fSopenharmony_ci " \"condition\" : \"test.sys.boot_from_charger_mode=1 " 386d9f0492fSopenharmony_ci " || test.sys.boot_from_charger_mode=2 || test.sys.boot_from_charger_mode=3\"," 387d9f0492fSopenharmony_ci " \"cmds\" : [" 388d9f0492fSopenharmony_ci " \"class_stop charger\"," 389d9f0492fSopenharmony_ci " \"trigger late-init\"" 390d9f0492fSopenharmony_ci " ]" 391d9f0492fSopenharmony_ci " }," 392d9f0492fSopenharmony_ci " {" 393d9f0492fSopenharmony_ci " \"name\" : \"load_persist_params_action\"," 394d9f0492fSopenharmony_ci " \"cmds\" : [" 395d9f0492fSopenharmony_ci " \"load_persist_params\"," 396d9f0492fSopenharmony_ci " \"start logd\"," 397d9f0492fSopenharmony_ci " \"start logd-reinit\"" 398d9f0492fSopenharmony_ci " ]" 399d9f0492fSopenharmony_ci " }," 400d9f0492fSopenharmony_ci " {" 401d9f0492fSopenharmony_ci " \"name\" : \"firmware_mounts_complete\"," 402d9f0492fSopenharmony_ci " \"cmds\" : [" 403d9f0492fSopenharmony_ci " \"rm /dev/.booting\"" 404d9f0492fSopenharmony_ci " ]" 405d9f0492fSopenharmony_ci " }" 406d9f0492fSopenharmony_ci "]" 407d9f0492fSopenharmony_ci "}"; 408d9f0492fSopenharmony_ci 409d9f0492fSopenharmony_civoid PrepareCmdLineData() 410d9f0492fSopenharmony_ci{ 411d9f0492fSopenharmony_ci const char *cmdLine = "bootgroup=device.boot.group earlycon=uart8250,mmio32,0xfe660000 " 412d9f0492fSopenharmony_ci "root=PARTUUID=614e0000-0000 rw rootwait rootfstype=ext4 console=ttyFIQ0 hardware=rk3568 " 413d9f0492fSopenharmony_ci "BOOT_IMAGE=/kernel init=/init default_boot_device=fe310000.sdhci bootslots=2 currentslot=1 initloglevel=2 " 414d9f0492fSopenharmony_ci "ohos.required_mount.system=" 415d9f0492fSopenharmony_ci "/dev/block/platform/fe310000.sdhci/by-name/system@/usr@ext4@ro,barrier=1@wait,required " 416d9f0492fSopenharmony_ci "ohos.required_mount.vendor=" 417d9f0492fSopenharmony_ci "/dev/block/platform/fe310000.sdhci/by-name/vendor@/vendor@ext4@ro,barrier=1@wait,required " 418d9f0492fSopenharmony_ci "ohos.required_mount.misc=" 419d9f0492fSopenharmony_ci "/dev/block/platform/fe310000.sdhci/by-name/misc@none@none@none@wait,required ohos.boot.eng_mode=on "; 420d9f0492fSopenharmony_ci CreateTestFile(BOOT_CMD_LINE, cmdLine); 421d9f0492fSopenharmony_ci} 422d9f0492fSopenharmony_ci 423d9f0492fSopenharmony_cistatic void PrepareAreaSizeFile(void) 424d9f0492fSopenharmony_ci{ 425d9f0492fSopenharmony_ci const char *ohosParamSize = "default_param=1024\n" 426d9f0492fSopenharmony_ci "hilog_param=2048\n" 427d9f0492fSopenharmony_ci "const_product_param=2048\n" 428d9f0492fSopenharmony_ci "startup_param=20480\n" 429d9f0492fSopenharmony_ci "persist_param=2048\n" 430d9f0492fSopenharmony_ci "const_param=20480\n" 431d9f0492fSopenharmony_ci "test_watch=102400\n" 432d9f0492fSopenharmony_ci "test_write=102400\n" 433d9f0492fSopenharmony_ci "const_param***=20480\n" 434d9f0492fSopenharmony_ci "persist_sys_param=2048\n" 435d9f0492fSopenharmony_ci "test_write=102400\n"; 436d9f0492fSopenharmony_ci CreateTestFile(PARAM_AREA_SIZE_CFG, ohosParamSize); 437d9f0492fSopenharmony_ci} 438d9f0492fSopenharmony_ci 439d9f0492fSopenharmony_cistatic void PrepareTestGroupFile(void) 440d9f0492fSopenharmony_ci{ 441d9f0492fSopenharmony_ci std::string groupData = "root:x:0:\n" 442d9f0492fSopenharmony_ci "bin:x:2:\n" 443d9f0492fSopenharmony_ci "system:x:1000:\n" 444d9f0492fSopenharmony_ci "log:x:1007:\n" 445d9f0492fSopenharmony_ci "deviceinfo:x:1102:\n" 446d9f0492fSopenharmony_ci "samgr:x:5555:\n" 447d9f0492fSopenharmony_ci "hdf_devmgr:x:3044:\n\n" 448d9f0492fSopenharmony_ci "power_host:x:3025:\n" 449d9f0492fSopenharmony_ci "servicectrl:x:1050:root, shell,system, samgr, hdf_devmgr \n" 450d9f0492fSopenharmony_ci "powerctrl:x:1051:root, shell,system, update,power_host\r\n" 451d9f0492fSopenharmony_ci "bootctrl:x:1052:root,shell,system\n" 452d9f0492fSopenharmony_ci "deviceprivate:x:1053:root,shell,system,samgr,hdf_devmgr,deviceinfo," 453d9f0492fSopenharmony_ci "dsoftbus,dms,account,useriam,access_token,device_manager,foundation,dbms,deviceauth,huks_server\n" 454d9f0492fSopenharmony_ci "hiview:x:1201:\n" 455d9f0492fSopenharmony_ci "hidumper_service:x:1212:\n" 456d9f0492fSopenharmony_ci "shell:x:2000:\n" 457d9f0492fSopenharmony_ci "cache:x:2001:\n" 458d9f0492fSopenharmony_ci "net_bw_stats:x:3006:\n"; 459d9f0492fSopenharmony_ci 460d9f0492fSopenharmony_ci CreateTestFile(STARTUP_INIT_UT_PATH "/etc/group", groupData.c_str()); 461d9f0492fSopenharmony_ci} 462d9f0492fSopenharmony_ci 463d9f0492fSopenharmony_cistatic void PrepareDacData() 464d9f0492fSopenharmony_ci{ 465d9f0492fSopenharmony_ci // for dac 466d9f0492fSopenharmony_ci std::string dacData = "ohos.servicectrl. = system:servicectrl:0775 \n"; 467d9f0492fSopenharmony_ci dacData += "startup.service.ctl. = system:servicectrl:0775:int\n"; 468d9f0492fSopenharmony_ci dacData += "test.permission. = root:root:0770\n"; 469d9f0492fSopenharmony_ci dacData += "test.permission.read. = root:root:0774\n"; 470d9f0492fSopenharmony_ci dacData += "test.permission.write.= root:root:0772\n"; 471d9f0492fSopenharmony_ci dacData += "test.permission.watcher. = root:root:0771\n"; 472d9f0492fSopenharmony_ci dacData += "test.test1. = system:test1:0771\n"; 473d9f0492fSopenharmony_ci dacData += "test.test2.watcher. = test2:root:0771\n"; 474d9f0492fSopenharmony_ci dacData += "test.type.int. = root:root:0777:int\n"; 475d9f0492fSopenharmony_ci dacData += "test.type.bool. = root:root:0777:bool\n"; 476d9f0492fSopenharmony_ci dacData += "test.type.string. = root:root:0777\n"; 477d9f0492fSopenharmony_ci dacData += "test.invalid.int. = root:root:\n"; 478d9f0492fSopenharmony_ci dacData += "test.invalid.int. = root::\n"; 479d9f0492fSopenharmony_ci dacData += "test.invalid.int. = ::\n"; 480d9f0492fSopenharmony_ci dacData += "test.invalid.int. = \n"; 481d9f0492fSopenharmony_ci dacData += "test.invalid.int. \n"; 482d9f0492fSopenharmony_ci CreateTestFile(STARTUP_INIT_UT_PATH "/system/etc/param/ohos.para.dac", dacData.c_str()); 483d9f0492fSopenharmony_ci CreateTestFile(STARTUP_INIT_UT_PATH "/system/etc/param/ohos.para.dac_1", dacData.c_str()); 484d9f0492fSopenharmony_ci} 485d9f0492fSopenharmony_ci 486d9f0492fSopenharmony_cistatic int TestHook(const HOOK_INFO *hookInfo, void *cookie) 487d9f0492fSopenharmony_ci{ 488d9f0492fSopenharmony_ci return 0; 489d9f0492fSopenharmony_ci} 490d9f0492fSopenharmony_ci 491d9f0492fSopenharmony_civoid PrepareInitUnitTestEnv(void) 492d9f0492fSopenharmony_ci{ 493d9f0492fSopenharmony_ci static int evnOk = 0; 494d9f0492fSopenharmony_ci if (evnOk) { 495d9f0492fSopenharmony_ci return; 496d9f0492fSopenharmony_ci } 497d9f0492fSopenharmony_ci printf("PrepareInitUnitTestEnv \n"); 498d9f0492fSopenharmony_ci#ifdef PARAM_SUPPORT_SELINUX 499d9f0492fSopenharmony_ci RegisterSecuritySelinuxOps(nullptr, 0); 500d9f0492fSopenharmony_ci#endif 501d9f0492fSopenharmony_ci 502d9f0492fSopenharmony_ci#ifndef OHOS_LITE 503d9f0492fSopenharmony_ci InitAddGlobalInitHook(0, TestHook); 504d9f0492fSopenharmony_ci InitAddPreParamServiceHook(0, TestHook); 505d9f0492fSopenharmony_ci InitAddPreParamLoadHook(0, TestHook); 506d9f0492fSopenharmony_ci InitAddPreCfgLoadHook(0, TestHook); 507d9f0492fSopenharmony_ci InitAddPostCfgLoadHook(0, TestHook); 508d9f0492fSopenharmony_ci InitAddPostPersistParamLoadHook(0, TestHook); 509d9f0492fSopenharmony_ci#endif 510d9f0492fSopenharmony_ci // read default parameter from system 511d9f0492fSopenharmony_ci LoadDefaultParams("/system/etc/param/ohos_const", LOAD_PARAM_NORMAL); 512d9f0492fSopenharmony_ci LoadDefaultParams("/vendor/etc/param", LOAD_PARAM_NORMAL); 513d9f0492fSopenharmony_ci LoadDefaultParams("/system/etc/param", LOAD_PARAM_ONLY_ADD); 514d9f0492fSopenharmony_ci 515d9f0492fSopenharmony_ci // read ut parameters 516d9f0492fSopenharmony_ci LoadDefaultParams(STARTUP_INIT_UT_PATH "/system/etc/param/ohos_const", LOAD_PARAM_NORMAL); 517d9f0492fSopenharmony_ci LoadDefaultParams(STARTUP_INIT_UT_PATH "/vendor/etc/param", LOAD_PARAM_NORMAL); 518d9f0492fSopenharmony_ci LoadDefaultParams(STARTUP_INIT_UT_PATH "/system/etc/param", LOAD_PARAM_ONLY_ADD); 519d9f0492fSopenharmony_ci LoadParamsFile(STARTUP_INIT_UT_PATH "/system/etc/param", LOAD_PARAM_ONLY_ADD); 520d9f0492fSopenharmony_ci LoadParamFromCfg(); 521d9f0492fSopenharmony_ci 522d9f0492fSopenharmony_ci int32_t loglevel = GetIntParameter("persist.init.debug.loglevel", INIT_ERROR); 523d9f0492fSopenharmony_ci SetInitLogLevel((InitLogLevel)loglevel); 524d9f0492fSopenharmony_ci 525d9f0492fSopenharmony_ci // for test int get 526d9f0492fSopenharmony_ci SystemWriteParam("test.int.get", "-101"); 527d9f0492fSopenharmony_ci SystemWriteParam("test.uint.get", "101"); 528d9f0492fSopenharmony_ci SystemWriteParam("test.string.get", "101"); 529d9f0492fSopenharmony_ci SystemWriteParam("test.bool.get.true", "true"); 530d9f0492fSopenharmony_ci SystemWriteParam("test.bool.get.false", "false"); 531d9f0492fSopenharmony_ci 532d9f0492fSopenharmony_ci evnOk = 1; 533d9f0492fSopenharmony_ci} 534d9f0492fSopenharmony_ci 535d9f0492fSopenharmony_ciint TestCheckParamPermission(const ParamLabelIndex *labelIndex, 536d9f0492fSopenharmony_ci const ParamSecurityLabel *srcLabel, const char *name, uint32_t mode) 537d9f0492fSopenharmony_ci{ 538d9f0492fSopenharmony_ci // DAC_RESULT_FORBIDED 539d9f0492fSopenharmony_ci return g_testPermissionResult; 540d9f0492fSopenharmony_ci} 541d9f0492fSopenharmony_ci 542d9f0492fSopenharmony_ciint TestFreeLocalSecurityLabel(ParamSecurityLabel *srcLabel) 543d9f0492fSopenharmony_ci{ 544d9f0492fSopenharmony_ci return 0; 545d9f0492fSopenharmony_ci} 546d9f0492fSopenharmony_ci 547d9f0492fSopenharmony_civoid SetStubResult(STUB_TYPE type, int result) 548d9f0492fSopenharmony_ci{ 549d9f0492fSopenharmony_ci g_stubResult[type] = result; 550d9f0492fSopenharmony_ci} 551d9f0492fSopenharmony_ci 552d9f0492fSopenharmony_ci#ifndef OHOS_LITE 553d9f0492fSopenharmony_cistatic void TestBeforeInit(void) 554d9f0492fSopenharmony_ci{ 555d9f0492fSopenharmony_ci ParamWorkSpace *paramSpace = GetParamWorkSpace(); 556d9f0492fSopenharmony_ci EXPECT_NE(paramSpace, nullptr); 557d9f0492fSopenharmony_ci InitParamService(); 558d9f0492fSopenharmony_ci CloseParamWorkSpace(); 559d9f0492fSopenharmony_ci paramSpace = GetParamWorkSpace(); 560d9f0492fSopenharmony_ci EXPECT_NE(paramSpace, nullptr); 561d9f0492fSopenharmony_ci 562d9f0492fSopenharmony_ci // test read cmdline 563d9f0492fSopenharmony_ci Fstab *stab = LoadRequiredFstab(); 564d9f0492fSopenharmony_ci ReleaseFstab(stab); 565d9f0492fSopenharmony_ci} 566d9f0492fSopenharmony_ci#endif 567d9f0492fSopenharmony_ci 568d9f0492fSopenharmony_cistatic pid_t g_currPid = 0; 569d9f0492fSopenharmony_cistatic __attribute__((constructor(101))) void ParamTestStubInit(void) 570d9f0492fSopenharmony_ci{ 571d9f0492fSopenharmony_ci g_currPid = getpid(); 572d9f0492fSopenharmony_ci printf("Init unit test start %u \n", g_currPid); 573d9f0492fSopenharmony_ci EnableInitLog(INIT_INFO); 574d9f0492fSopenharmony_ci InitParseGroupCfg(); 575d9f0492fSopenharmony_ci // prepare data 576d9f0492fSopenharmony_ci mkdir(STARTUP_INIT_UT_PATH, S_IRWXU | S_IRWXG | S_IRWXO); 577d9f0492fSopenharmony_ci CheckAndCreateDir(STARTUP_INIT_UT_PATH MODULE_LIB_NAME "/autorun/"); 578d9f0492fSopenharmony_ci int cmdIndex = 0; 579d9f0492fSopenharmony_ci (void)GetMatchCmd("copy ", &cmdIndex); 580d9f0492fSopenharmony_ci DoCmdByIndex(cmdIndex, MODULE_LIB_NAME"/libbootchart.z.so " 581d9f0492fSopenharmony_ci STARTUP_INIT_UT_PATH MODULE_LIB_NAME "/libbootchart.z.so", nullptr); 582d9f0492fSopenharmony_ci DoCmdByIndex(cmdIndex, MODULE_LIB_NAME"/libbootchart.z.so " 583d9f0492fSopenharmony_ci STARTUP_INIT_UT_PATH MODULE_LIB_NAME "/autorun/libbootchart.z.so", nullptr); 584d9f0492fSopenharmony_ci PrepareUeventdcfg(); 585d9f0492fSopenharmony_ci PrepareInnerKitsCfg(); 586d9f0492fSopenharmony_ci PrepareModCfg(); 587d9f0492fSopenharmony_ci PrepareGroupTestCfg(); 588d9f0492fSopenharmony_ci PrepareDacData(); 589d9f0492fSopenharmony_ci CreateTestFile(STARTUP_INIT_UT_PATH"/trigger_test.cfg", g_triggerData); 590d9f0492fSopenharmony_ci PrepareAreaSizeFile(); 591d9f0492fSopenharmony_ci PrepareTestGroupFile(); 592d9f0492fSopenharmony_ci PrepareCmdLineData(); 593d9f0492fSopenharmony_ci TestSetSelinuxOps(); 594d9f0492fSopenharmony_ci 595d9f0492fSopenharmony_ci PARAM_LOGI("TestSetSelinuxOps \n"); 596d9f0492fSopenharmony_ci#ifndef OHOS_LITE 597d9f0492fSopenharmony_ci TestBeforeInit(); 598d9f0492fSopenharmony_ci#endif 599d9f0492fSopenharmony_ci#ifndef __LITEOS_A__ 600d9f0492fSopenharmony_ci SystemInit(); 601d9f0492fSopenharmony_ci#endif 602d9f0492fSopenharmony_ci PARAM_LOGI("SystemConfig \n"); 603d9f0492fSopenharmony_ci SystemConfig(NULL); 604d9f0492fSopenharmony_ci PrepareInitUnitTestEnv(); 605d9f0492fSopenharmony_ci} 606d9f0492fSopenharmony_ci 607d9f0492fSopenharmony_ci__attribute__((destructor)) static void ParamTestStubExit(void) 608d9f0492fSopenharmony_ci{ 609d9f0492fSopenharmony_ci PARAM_LOGI("ParamTestStubExit %u %u \n", g_currPid, getpid()); 610d9f0492fSopenharmony_ci if (g_currPid != getpid()) { 611d9f0492fSopenharmony_ci return; 612d9f0492fSopenharmony_ci } 613d9f0492fSopenharmony_ci#ifndef OHOS_LITE 614d9f0492fSopenharmony_ci StopParamService(); 615d9f0492fSopenharmony_ci 616d9f0492fSopenharmony_ci HookMgrExecute(GetBootStageHookMgr(), INIT_BOOT_COMPLETE, nullptr, nullptr); 617d9f0492fSopenharmony_ci CloseUeventConfig(); 618d9f0492fSopenharmony_ci CloseServiceSpace(); 619d9f0492fSopenharmony_ci demoExit(); 620d9f0492fSopenharmony_ci LE_CloseLoop(LE_GetDefaultLoop()); 621d9f0492fSopenharmony_ci HookMgrDestroy(GetBootStageHookMgr()); 622d9f0492fSopenharmony_ci#endif 623d9f0492fSopenharmony_ci} 624d9f0492fSopenharmony_ci 625d9f0492fSopenharmony_ci#ifdef OHOS_LITE 626d9f0492fSopenharmony_civoid __attribute__((weak))LE_DoAsyncEvent(const LoopHandle loopHandle, const TaskHandle taskHandle) 627d9f0492fSopenharmony_ci{ 628d9f0492fSopenharmony_ci} 629d9f0492fSopenharmony_ci 630d9f0492fSopenharmony_ciconst char* HalGetSerial(void) 631d9f0492fSopenharmony_ci{ 632d9f0492fSopenharmony_ci static const char *serial = "1234567890"; 633d9f0492fSopenharmony_ci return serial; 634d9f0492fSopenharmony_ci} 635d9f0492fSopenharmony_ci#endif 636d9f0492fSopenharmony_ci 637d9f0492fSopenharmony_ciint __attribute__((weak))SprintfStub(char *buffer, size_t size, const char *fmt, ...) 638d9f0492fSopenharmony_ci{ 639d9f0492fSopenharmony_ci int len = -1; 640d9f0492fSopenharmony_ci va_list vargs; 641d9f0492fSopenharmony_ci va_start(vargs, fmt); 642d9f0492fSopenharmony_ci len = vsnprintf_s(buffer, size, size - 1, fmt, vargs); 643d9f0492fSopenharmony_ci va_end(vargs); 644d9f0492fSopenharmony_ci return len; 645d9f0492fSopenharmony_ci} 646d9f0492fSopenharmony_ci 647d9f0492fSopenharmony_ciint __attribute__((weak))MountStub(const char* source, const char* target, 648d9f0492fSopenharmony_ci const char* filesystemtype, unsigned long mountflags, const void * data) 649d9f0492fSopenharmony_ci{ 650d9f0492fSopenharmony_ci return g_stubResult[STUB_MOUNT]; 651d9f0492fSopenharmony_ci} 652d9f0492fSopenharmony_ci 653d9f0492fSopenharmony_ciint __attribute__((weak))UmountStub(const char *target) 654d9f0492fSopenharmony_ci{ 655d9f0492fSopenharmony_ci return 0; 656d9f0492fSopenharmony_ci} 657d9f0492fSopenharmony_ci 658d9f0492fSopenharmony_ciint __attribute__((weak))Umount2Stub(const char *target, int flags) 659d9f0492fSopenharmony_ci{ 660d9f0492fSopenharmony_ci return 0; 661d9f0492fSopenharmony_ci} 662d9f0492fSopenharmony_ci 663d9f0492fSopenharmony_ciint __attribute__((weak))SymlinkStub(const char * oldpath, const char * newpath) 664d9f0492fSopenharmony_ci{ 665d9f0492fSopenharmony_ci return 0; 666d9f0492fSopenharmony_ci} 667d9f0492fSopenharmony_ci 668d9f0492fSopenharmony_ciint PrctlStub(int option, ...) 669d9f0492fSopenharmony_ci{ 670d9f0492fSopenharmony_ci if (option == PR_SET_SECUREBITS) { 671d9f0492fSopenharmony_ci static int count = 0; 672d9f0492fSopenharmony_ci count++; 673d9f0492fSopenharmony_ci return (count % g_testRandom == 1) ? 0 : -1; 674d9f0492fSopenharmony_ci } 675d9f0492fSopenharmony_ci if (option == PR_CAP_AMBIENT) { 676d9f0492fSopenharmony_ci static int count1 = 0; 677d9f0492fSopenharmony_ci count1++; 678d9f0492fSopenharmony_ci return (count1 % g_testRandom == 1) ? 0 : -1; 679d9f0492fSopenharmony_ci } 680d9f0492fSopenharmony_ci return 0; 681d9f0492fSopenharmony_ci} 682d9f0492fSopenharmony_ci 683d9f0492fSopenharmony_ciint ExecvStub(const char *pathname, char *const argv[]) 684d9f0492fSopenharmony_ci{ 685d9f0492fSopenharmony_ci printf("ExecvStub %s \n", pathname); 686d9f0492fSopenharmony_ci return 0; 687d9f0492fSopenharmony_ci} 688d9f0492fSopenharmony_ci 689d9f0492fSopenharmony_ciint LchownStub(const char *pathname, uid_t owner, gid_t group) 690d9f0492fSopenharmony_ci{ 691d9f0492fSopenharmony_ci return 0; 692d9f0492fSopenharmony_ci} 693d9f0492fSopenharmony_ci 694d9f0492fSopenharmony_ciint KillStub(pid_t pid, int signal) 695d9f0492fSopenharmony_ci{ 696d9f0492fSopenharmony_ci return 0; 697d9f0492fSopenharmony_ci} 698d9f0492fSopenharmony_ci 699d9f0492fSopenharmony_ciint ExecveStub(const char *pathname, char *const argv[], char *const envp[]) 700d9f0492fSopenharmony_ci{ 701d9f0492fSopenharmony_ci printf("ExecveStub %s \n", pathname); 702d9f0492fSopenharmony_ci return 0; 703d9f0492fSopenharmony_ci} 704d9f0492fSopenharmony_ci 705d9f0492fSopenharmony_ciint LoadPolicy() 706d9f0492fSopenharmony_ci{ 707d9f0492fSopenharmony_ci return 0; 708d9f0492fSopenharmony_ci} 709d9f0492fSopenharmony_ci 710d9f0492fSopenharmony_cistatic int g_selinuxOptResult = 0; 711d9f0492fSopenharmony_ciint setcon(const char *name) 712d9f0492fSopenharmony_ci{ 713d9f0492fSopenharmony_ci g_selinuxOptResult++; 714d9f0492fSopenharmony_ci return g_selinuxOptResult % g_testRandom; 715d9f0492fSopenharmony_ci} 716d9f0492fSopenharmony_ci 717d9f0492fSopenharmony_ciint RestoreconRecurse(const char *name) 718d9f0492fSopenharmony_ci{ 719d9f0492fSopenharmony_ci g_selinuxOptResult++; 720d9f0492fSopenharmony_ci return g_selinuxOptResult % g_testRandom; 721d9f0492fSopenharmony_ci} 722d9f0492fSopenharmony_ci 723d9f0492fSopenharmony_ciint setexeccon(const char *name) 724d9f0492fSopenharmony_ci{ 725d9f0492fSopenharmony_ci g_selinuxOptResult++; 726d9f0492fSopenharmony_ci return g_selinuxOptResult % g_testRandom; 727d9f0492fSopenharmony_ci} 728d9f0492fSopenharmony_ci 729d9f0492fSopenharmony_ciint setsockcreatecon(const char *name) 730d9f0492fSopenharmony_ci{ 731d9f0492fSopenharmony_ci g_selinuxOptResult++; 732d9f0492fSopenharmony_ci return g_selinuxOptResult % g_testRandom; 733d9f0492fSopenharmony_ci} 734d9f0492fSopenharmony_ci 735d9f0492fSopenharmony_ciint setfilecon(const char *name, const char *content) 736d9f0492fSopenharmony_ci{ 737d9f0492fSopenharmony_ci g_selinuxOptResult++; 738d9f0492fSopenharmony_ci return g_selinuxOptResult % g_testRandom; 739d9f0492fSopenharmony_ci} 740d9f0492fSopenharmony_ci 741d9f0492fSopenharmony_ciParamLabelIndex *TestGetParamLabelIndex(const char *name) 742d9f0492fSopenharmony_ci{ 743d9f0492fSopenharmony_ci static ParamLabelIndex labelIndex = {0}; 744d9f0492fSopenharmony_ci uint32_t index = 0; 745d9f0492fSopenharmony_ci ParamWorkSpace *paramWorkspace = GetParamWorkSpace(); 746d9f0492fSopenharmony_ci if (paramWorkspace == nullptr) { 747d9f0492fSopenharmony_ci return &labelIndex; 748d9f0492fSopenharmony_ci } 749d9f0492fSopenharmony_ci#ifdef PARAM_SUPPORT_SELINUX 750d9f0492fSopenharmony_ci if (paramWorkspace->selinuxSpace.getParamLabelIndex == nullptr) { 751d9f0492fSopenharmony_ci return &labelIndex; 752d9f0492fSopenharmony_ci } 753d9f0492fSopenharmony_ci index = (uint32_t)paramWorkspace->selinuxSpace.getParamLabelIndex(name) + WORKSPACE_INDEX_BASE; 754d9f0492fSopenharmony_ci if (index >= paramWorkspace->maxLabelIndex) { 755d9f0492fSopenharmony_ci return &labelIndex; 756d9f0492fSopenharmony_ci } 757d9f0492fSopenharmony_ci#endif 758d9f0492fSopenharmony_ci labelIndex.workspace = paramWorkspace->workSpace[index]; 759d9f0492fSopenharmony_ci PARAM_CHECK(labelIndex.workspace != nullptr, return nullptr, "Invalid workSpace"); 760d9f0492fSopenharmony_ci labelIndex.selinuxLabelIndex = labelIndex.workspace->spaceIndex; 761d9f0492fSopenharmony_ci (void)FindTrieNode(paramWorkspace->workSpace[0], name, strlen(name), &labelIndex.dacLabelIndex); 762d9f0492fSopenharmony_ci return &labelIndex; 763d9f0492fSopenharmony_ci} 764d9f0492fSopenharmony_ci#ifdef __cplusplus 765d9f0492fSopenharmony_ci#if __cplusplus 766d9f0492fSopenharmony_ci} 767d9f0492fSopenharmony_ci#endif 768d9f0492fSopenharmony_ci#endif 769