#include "hal/hal.h"
#define BUFF_MAX 255
+#define MAX_NUM 255
static enum pass_state is_supported(char *value)
{
struct pass_policy *policy = user_data;
struct pass_scenario_policy *scenario = &policy->scenario;
- if (!policy && !scenario && !result)
+ if (!policy || !result)
return 0;
if (!result->section || !result->name || !result->value)
return -EINVAL;
} else if (MATCH(result->name, "pass_num_scenarios")) {
- scenario->num_scenarios = atoi(result->value);
+ unsigned int num_scenarios;
+
+ num_scenarios = atoi(result->value);
+ if (num_scenarios > MAX_NUM) {
+ _E("cannot parse %s\n", result->name);
+ return -EINVAL;
+ }
+
+ scenario->num_scenarios = num_scenarios;
if (scenario->num_scenarios > 0 && !scenario->list) {
scenario->list = calloc(scenario->num_scenarios,
/* Parse 'Scenario' section */
if (MATCH(result->name, "name")) {
- strcpy(scenario->list[index].name, result->value);
+ snprintf(scenario->list[index].name, PASS_NAME_LEN, "%s",
+ result->value);
} else if (MATCH(result->name, "support")) {
scenario->list[index].state = is_supported(result->value);
if (scenario->list[index].state < 0)
policy->state = atoi(result->value);
else if (MATCH(result->name, "pass_gov_type"))
policy->gov_type = atoi(result->value);
- else if (MATCH(result->name, "pass_num_levels"))
- policy->num_levels = atoi(result->value);
- else if (MATCH(result->name, "pass_min_level"))
+ else if (MATCH(result->name, "pass_num_levels")) {
+ unsigned int num_levels = atoi(result->value);
+
+ if (num_levels > MAX_NUM) {
+ _E("cannot parse %s\n", result->name);
+ return -EINVAL;
+ }
+ policy->num_levels = num_levels;
+ } else if (MATCH(result->name, "pass_min_level"))
policy->min_level = atoi(result->value);
else if (MATCH(result->name, "pass_max_level"))
policy->max_level = atoi(result->value);
/* Parsing 'Level' section to get pass-table */
for (level = 0; level < policy->num_levels; level++) {
- ret = sprintf(section_name, "Level%d", level);
+ ret = snprintf(section_name, BUFF_MAX, "Level%d", level);
if (MATCH(result->section, section_name)) {
ret = pass_parse_level(result, user_data, level);
/* Parsing 'Scenario' section */
for (index = 0; index < scenario->num_scenarios; index++) {
- ret = sprintf(section_name, "Scenario%d", index);
+ ret = snprintf(section_name, BUFF_MAX, "Scenario%d", index);
if (MATCH(result->section, section_name)) {
ret = pass_parse_scenario(result, user_data, index);
conf_data->res_type = atoi(result->value);
} else if (MATCH(result->name, "pass_res_name")) {
int len = strlen(result->value);
- strncpy(conf_data->res_name, result->value, len);
+ snprintf(conf_data->res_name, len + 1, "%s", result->value);
} else if (MATCH(result->name, "pass_path_conf_file")) {
int len = strlen(result->value);
- strncpy(conf_data->path_conf_file, result->value, len);
+ snprintf(conf_data->path_conf_file, len + 1, "%s", result->value);
} else if (MATCH(result->name, "pass_path_load_table")) {
int len = strlen(result->value);
- strncpy(conf_data->path_load_table, result->value, len);
+ snprintf(conf_data->path_load_table, len + 1, "%s", result->value);
} else if (MATCH(result->name, "pass_first_cpu")) {
int pass_res_type = conf_data->res_type;
if (MATCH(result->section, "PassResource")) {
if (MATCH(result->name, "pass_compatible")) {
len = strlen(result->value);
- strncpy(compatible, result->value, len);
+ snprintf(compatible, len + 1, "%s", result->value);
len = strlen(path_compatible);
if (len > 0) {
}
} else if (MATCH(result->name, "pass_path_compatible")) {
len = strlen(result->value);
- strncpy(path_compatible, result->value, len);
+ snprintf(path_compatible, len + 1, "%s", result->value);
len =strlen(compatible);
if (len > 0) {
is_compatible = true;
}
} else if (MATCH(result->name, "pass_num_resources")) {
- pass->num_resources = atoi(result->value);
+ unsigned int num_resources = atoi(result->value);
+
+ if ((num_resources > MAX_NUM) ||
+ (num_resources < 1)) {
+ _E("cannot parse %s\n", result->name);
+ return -EINVAL;
+ }
+ pass->num_resources = num_resources;
pass->res = calloc(pass->num_resources,
sizeof(struct pass_resource));
/* Parsing 'PassResource[X]' section */
for (id = 0; id < pass->num_resources; id++) {
- ret = sprintf(section_name, "PassResource%d", id);
+ ret = snprintf(section_name, BUFF_MAX, "PassResource%d", id);
if (MATCH(section_name, result->section)) {
if (!is_compatible) {