diff --git a/services/include/init_cmds.h b/services/include/init_cmds.h index 469ef4fb29d45bee13f1b31d37bf47c770de59b3..232f24a3d3a515cca0eb3217a1b7bcfffada763e 100644 --- a/services/include/init_cmds.h +++ b/services/include/init_cmds.h @@ -50,7 +50,7 @@ struct CmdArgs { char **argv; }; -int GetParamValue(char *symValue, char *paramValue, unsigned int paramLen); +int GetParamValue(const char *symValue, char *paramValue, unsigned int paramLen); struct CmdArgs* GetCmd(const char *cmdContent, const char *delim, int argsCount); void FreeCmd(struct CmdArgs **cmd); diff --git a/services/log/init_log.c b/services/log/init_log.c index 0e58910051c36bff424be59d93cc92d09c8aa3ca..aa0307903f2bec7eed6e27430351c216b259dcfa 100644 --- a/services/log/init_log.c +++ b/services/log/init_log.c @@ -53,7 +53,7 @@ void InitToHiLog(const char *tag, LogLevel logLevel, const char *fmt, ...) return; } if (tag == NULL) { - return; + tag = "Init"; } va_list list; va_start(list, fmt); diff --git a/services/src/device.c b/services/src/device.c index 7464d1548b93f9ab636b419e3eb2a822528660d0..4c6c88c281b1a40a9b2aa8fe24cf617be987c986 100644 --- a/services/src/device.c +++ b/services/src/device.c @@ -22,8 +22,8 @@ #include #include "init_log.h" -#define DEFAULT_RW_MODE 0666 -#define DEFAULT_NO_AUTHORITY_MODE 0600 +#define DEFAULT_RW_MODE S_IRUSR | S_IWUSR | S_IRGRP | S_IRGRP | S_IROTH | S_IWOTH +#define DEFAULT_NO_AUTHORITY_MODE S_IWUSR | S_IRUSR #define DEVICE_ID_THIRD 3 #define DEVICE_ID_EIGHTH 8 #define DEVICE_ID_NINTH 9 diff --git a/services/src/init_cmds.c b/services/src/init_cmds.c index b56026ba7b6ff89ead91923b1d71e2911ea0e01c..4e16ba454703ee7f2df0e6cd2fbad2c523e0b5fd 100644 --- a/services/src/init_cmds.c +++ b/services/src/init_cmds.c @@ -42,7 +42,7 @@ #include "init_utils.h" #include "securec.h" -#define DEFAULT_DIR_MODE 0755 // mkdir, default mode +#define DEFAULT_DIR_MODE S_IRWXU | S_IRGRP | S_IXGRP | S_IXOTH | S_IROTH // mkdir, default mode #define SPACES_CNT_IN_CMD_MAX 10 // mount, max number of spaces in cmdline #define SPACES_CNT_IN_CMD_MIN 2 // mount, min number of spaces in cmdline @@ -88,7 +88,7 @@ static const char* g_supportedCmds[] = { }; #ifndef OHOS_LITE -int GetParamValue(char *symValue, char *paramValue, unsigned int paramLen) +int GetParamValue(const char *symValue, char *paramValue, unsigned int paramLen) { if ((symValue == NULL) || (paramValue == NULL) || (paramLen == 0)) { return -1; @@ -143,7 +143,7 @@ int GetParamValue(char *symValue, char *paramValue, unsigned int paramLen) } #else // For ite ohos, do not support parameter operation. just do string copy -inline int GetParamValue(char *symValue, char *paramValue, unsigned int paramLen) +inline int GetParamValue(const char *symValue, char *paramValue, unsigned int paramLen) { return (strncpy_s(paramValue, paramLen, symValue, strlen(symValue)) == EOK) ? 0 : -1; } @@ -777,7 +777,7 @@ static void DoLoadCfg(const char *path) return; } - while (fgets(buf, LOADCFG_BUF_SIZE, fp) != NULL && maxLoop < LOADCFG_MAX_LOOP) { + while (fgets(buf, LOADCFG_BUF_SIZE - 1, fp) != NULL && maxLoop < LOADCFG_MAX_LOOP) { maxLoop++; len = strlen(buf); if (len < 1) { diff --git a/services/src/init_import.c b/services/src/init_import.c index 08fd54d7f8459c854b06a2c0c68fd94f1ce85134..f3ae09df2fc1ce350fa8cea76cc613ecffc5cb20 100644 --- a/services/src/init_import.c +++ b/services/src/init_import.c @@ -29,6 +29,9 @@ static int ExtractCfgFile(char **cfgFile, char *content) return -1; } size_t cfgFileLen = strlen(content) + MAX_PARAM_VALUE_LEN + 1; + if (cfgFileLen <= 0) { + return -1; + } if ((*cfgFile = malloc(cfgFileLen)) == NULL) { INIT_LOGW("Failed to allocate memory to import cfg file. err = %d", errno); return -1; diff --git a/services/src/init_reboot.c b/services/src/init_reboot.c index b059fa43fa21ab0ce15d74d880fba873da0869d8..ef09003d35fe3fa912993355d10ed3bc293fd8c4 100644 --- a/services/src/init_reboot.c +++ b/services/src/init_reboot.c @@ -113,7 +113,7 @@ static int GetMountStatusForMountPoint(const char *mountPoint) return 1; } - while (fgets(buffer, sizeof(buffer), fp) != NULL) { + while (fgets(buffer, sizeof(buffer) - 1, fp) != NULL) { n = strlen(buffer); if (buffer[n - 1] == '\n') { buffer[n - 1] = '\0'; diff --git a/services/src/init_service.c b/services/src/init_service.c index 592d98b128d3b314cd75d712539eb5a89b34f5b6..2fa60e84acbdc09080357f7b7a268187cc73d311 100644 --- a/services/src/init_service.c +++ b/services/src/init_service.c @@ -200,14 +200,22 @@ int ServiceStart(Service *service) if (service->writepidFiles[i] == NULL) { continue; } - FILE *fd = fopen(service->writepidFiles[i], "wb"); + char *realPath = realpath(service->writepidFiles[i], NULL); + if (realPath == NULL) { + continue; + } + FILE *fd = fopen(realPath, "wb"); if (fd == NULL) { INIT_LOGE("start service writepidFiles %s invalid.", service->writepidFiles[i]); + free(realPath); + realPath = NULL; continue; } if (fwrite(pidString, 1, strlen(pidString), fd) != strlen(pidString)) { INIT_LOGE("start service writepid error.file:%s pid:%s", service->writepidFiles[i], pidString); } + free(realPath); + realPath = NULL; fclose(fd); INIT_LOGE("ServiceStart writepid filename=%s, childPid=%s, ok", service->writepidFiles[i], pidString); diff --git a/services/src/init_service_manager.c b/services/src/init_service_manager.c index 9cc181be33b347ce7cdc5a9766cc89dacab5dc3e..e3f6a44141540ee0457ea0833c41e9310f28712a 100644 --- a/services/src/init_service_manager.c +++ b/services/src/init_service_manager.c @@ -178,14 +178,12 @@ static int GetWritepidStrings(const cJSON *curArrItem, Service *curServ) } for (int i = 0; i < writepidCnt; ++i) { - if (!cJSON_GetArrayItem(filedJ, i) || !cJSON_GetStringValue(cJSON_GetArrayItem(filedJ, i)) - || strlen(cJSON_GetStringValue(cJSON_GetArrayItem(filedJ, i))) <= 0) { // check all errors - INIT_LOGE("GetWritepidStrings, parse item[%d] error.", i); + cJSON *item = cJSON_GetArrayItem(filedJ, i); + if (item == NULL) { return SERVICE_FAILURE; } - - char *fieldStr = cJSON_GetStringValue(cJSON_GetArrayItem(filedJ, i)); - if (fieldStr == NULL) { + char *fieldStr = cJSON_GetStringValue(item); + if ((fieldStr == NULL) || (fieldStr[0] == '\0')) { return SERVICE_FAILURE; } size_t strLen = strlen(fieldStr); @@ -267,12 +265,14 @@ static int GetGidArray(const cJSON *curArrItem, Service *curServ) // gid curServ->servPerm.gIDCnt = gIDCnt; int i = 0; for (; i < gIDCnt; ++i) { - if (cJSON_GetArrayItem(filedJ, i) == NULL || !cJSON_GetStringValue(cJSON_GetArrayItem(filedJ, i)) - || strlen(cJSON_GetStringValue(cJSON_GetArrayItem(filedJ, i))) <= 0) { // check all errors - INIT_LOGE("GetGidArray, parse item[%d] as string, error.", i); + cJSON *item = cJSON_GetArrayItem(filedJ, i); + if (item == NULL) { + break; + } + char *fieldStr = cJSON_GetStringValue(item); + if ((fieldStr == NULL) || (fieldStr[0] == '\0')) { break; } - char *fieldStr = cJSON_GetStringValue(cJSON_GetArrayItem(filedJ, i)); gid_t gID = DecodeUid(fieldStr); if ((gID) == (gid_t)(-1)) { INIT_LOGE("GetGidArray, DecodeUid item[%d] error.", i); @@ -284,11 +284,14 @@ static int GetGidArray(const cJSON *curArrItem, Service *curServ) // gid return SERVICE_SUCCESS; } for (i = 0; i < gIDCnt; ++i) { - if (cJSON_GetArrayItem(filedJ, i) == NULL || !cJSON_IsNumber(cJSON_GetArrayItem(filedJ, i))) { - INIT_LOGE("GetGidArray, parse item[%d] as number, error.", i); + cJSON *item = cJSON_GetArrayItem(filedJ, i); + if (item == NULL) { + break; + } + if (!cJSON_IsNumber(item)) { break; } - gid_t gID = (int)cJSON_GetNumberValue(cJSON_GetArrayItem(filedJ, i)); + gid_t gID = (int)cJSON_GetNumberValue(item); if (gID < 0) { INIT_LOGE("GetGidArray gID = %d, error", gID); break; @@ -533,7 +536,7 @@ static int GetServiceSocket(const cJSON* curArrItem, Service* curServ) } curServ->socketCfg = NULL; for (int i = 0; i < sockCnt; ++i) { - cJSON* sockJ = cJSON_GetArrayItem(filedJ, i); + cJSON *sockJ = cJSON_GetArrayItem(filedJ, i); if (!cJSON_IsString(sockJ) || !cJSON_GetStringValue(sockJ)) { return SERVICE_FAILURE; } @@ -549,6 +552,8 @@ static int GetServiceSocket(const cJSON* curArrItem, Service* curServ) } int ret = ParseServiceSocket(tmpStr, SOCK_OPT_NUMS, socktmp); if (ret < 0) { + free(socktmp); + socktmp = NULL; return SERVICE_FAILURE; } if (curServ->socketCfg == NULL) { diff --git a/services/src/init_service_socket.c b/services/src/init_service_socket.c index 18fd117ebc093c701a98e9b6f485cc2dda8187a0..f6d9720c249c1014c62f53b8d06f5384c091b9e1 100644 --- a/services/src/init_service_socket.c +++ b/services/src/init_service_socket.c @@ -92,7 +92,7 @@ static int CreateSocket(struct ServiceSocket *sockopt) return sockopt->sockFd; } -static int SetSocketEnv(int fd, char *name) +static int SetSocketEnv(int fd, const char *name) { if (name == NULL) { return -1; diff --git a/services/src/init_utils.c b/services/src/init_utils.c index c7467a3951258e1334f67786610d86beab3aa79c..f1dba38a040d2f80527d30f0effbfea289cacff6 100644 --- a/services/src/init_utils.c +++ b/services/src/init_utils.c @@ -65,11 +65,11 @@ int DecodeUid(const char *name) } return result; } else { - struct passwd *pwd = getpwnam(name); - if (pwd == NULL) { + struct passwd *userInf = getpwnam(name); + if (userInf == NULL) { return -1; } - return pwd->pw_uid; + return userInf->pw_uid; } }