1 /*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include <ctype.h>
16 #include <limits.h>
17
18 #include "param_manager.h"
19 #include "param_trie.h"
20 #include "param_base.h"
21
GetWorkSpaceByName(const char * name)22 INIT_LOCAL_API WorkSpace *GetWorkSpaceByName(const char *name)
23 {
24 ParamWorkSpace *paramSpace = GetParamWorkSpace();
25 PARAM_CHECK(paramSpace != NULL, return NULL, "Invalid paramSpace");
26 #ifdef PARAM_SUPPORT_SELINUX
27 if (paramSpace->selinuxSpace.getParamLabelIndex == NULL) {
28 return NULL;
29 }
30 uint32_t labelIndex = (uint32_t)paramSpace->selinuxSpace.getParamLabelIndex(name) + WORKSPACE_INDEX_BASE;
31 if (labelIndex < paramSpace->maxSpaceCount) {
32 return paramSpace->workSpace[labelIndex];
33 }
34 return NULL;
35 #else
36 return paramSpace->workSpace[WORKSPACE_INDEX_DAC];
37 #endif
38 }
39
GetWorkSpace(uint32_t labelIndex)40 INIT_LOCAL_API WorkSpace *GetWorkSpace(uint32_t labelIndex)
41 {
42 ParamWorkSpace *paramSpace = GetParamWorkSpace();
43 PARAM_CHECK(paramSpace != NULL, return NULL, "Invalid paramSpace");
44 PARAM_CHECK(paramSpace->workSpace != NULL, return NULL, "Invalid paramSpace->workSpace");
45 PARAM_WORKSPACE_CHECK(paramSpace, return NULL, "Invalid space");
46 #ifdef PARAM_SUPPORT_SELINUX
47 if (labelIndex == 0) {
48 return paramSpace->workSpace[0];
49 }
50 WorkSpace *workSpace = NULL;
51 if (labelIndex < paramSpace->maxSpaceCount) {
52 workSpace = paramSpace->workSpace[labelIndex];
53 }
54 if (workSpace == NULL) {
55 return NULL;
56 }
57 uint32_t rwSpaceLock = ATOMIC_LOAD_EXPLICIT(&workSpace->rwSpaceLock, MEMORY_ORDER_ACQUIRE);
58 if (rwSpaceLock & WORKSPACE_STATUS_IN_PROCESS) {
59 return NULL;
60 }
61 if (workSpace->area != NULL) {
62 return workSpace;
63 }
64 return NULL;
65 #else
66 return paramSpace->workSpace[0];
67 #endif
68 }
69
GetParamSecurityOps(int type)70 INIT_LOCAL_API ParamSecurityOps *GetParamSecurityOps(int type)
71 {
72 PARAM_CHECK(type < PARAM_SECURITY_MAX, return NULL, "Invalid type");
73 ParamWorkSpace *paramSpace = GetParamWorkSpace();
74 PARAM_CHECK(paramSpace != NULL, return NULL, "Invalid paramSpace");
75 return ¶mSpace->paramSecurityOps[type];
76 }
77
GetParamSecurityLabel()78 INIT_LOCAL_API ParamSecurityLabel *GetParamSecurityLabel()
79 {
80 ParamWorkSpace *paramSpace = GetParamWorkSpace();
81 PARAM_CHECK(paramSpace != NULL, return NULL, "Invalid paramSpace");
82 return ¶mSpace->securityLabel;
83 }
84
SplitParamString(char * line,const char * exclude[],uint32_t count,int (* result)(const uint32_t * context,const char * name,const char * value),const uint32_t * context)85 INIT_LOCAL_API int SplitParamString(char *line, const char *exclude[], uint32_t count,
86 int (*result)(const uint32_t *context, const char *name, const char *value), const uint32_t *context)
87 {
88 PARAM_CHECK(line != NULL, return 0, "Empty line");
89 // Skip spaces
90 char *name = line;
91 while (isspace(*name) && (*name != '\0')) {
92 name++;
93 }
94 // Empty line or Comment line
95 if (*name == '\0' || *name == '#') {
96 return 0;
97 }
98
99 char *value = name;
100 // find the first delimiter '='
101 while (*value != '\0') {
102 if (*value == '=') {
103 (*value) = '\0';
104 value = value + 1;
105 break;
106 }
107 value++;
108 }
109
110 // Skip spaces
111 char *tmp = name;
112 while ((tmp < value) && (*tmp != '\0')) {
113 if (isspace(*tmp)) {
114 (*tmp) = '\0';
115 break;
116 }
117 tmp++;
118 }
119
120 // empty name, just ignore this line
121 if (*value == '\0') {
122 return 0;
123 }
124
125 // Filter excluded parameters
126 for (uint32_t i = 0; i < count; i++) {
127 if (strncmp(name, exclude[i], strlen(exclude[i])) == 0) {
128 return 0;
129 }
130 }
131
132 // Skip spaces for value
133 while (isspace(*value) && (*value != '\0')) {
134 value++;
135 }
136
137 // Trim the ending spaces of value
138 char *pos = value + strlen(value);
139 pos--;
140 while (isspace(*pos) && pos > value) {
141 (*pos) = '\0';
142 pos--;
143 }
144
145 // Strip starting and ending " for value
146 if ((*value == '"') && (pos > value) && (*pos == '"')) {
147 value = value + 1;
148 *pos = '\0';
149 }
150 return result(context, name, value);
151 }
152