pass: Replace obsolescent ato[if] functions with strto[ld] 03/191603/1
authorChanwoo Choi <cw00.choi@samsung.com>
Thu, 18 Oct 2018 07:40:04 +0000 (16:40 +0900)
committerChanwoo Choi <cw00.choi@samsung.com>
Fri, 19 Oct 2018 02:58:42 +0000 (11:58 +0900)
Replace obsolescent ato[if] functions with recommended strto[ld]
according to codingy guide[1].

[1] https://wiki.sei.cmu.edu/confluence/display/c/MSC24-C.+Do+not+use+deprecated+or+obsolescent+functions

Change-Id: I23342d7312c1fe77b3734cb23b57948ceac7832b
Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
include/pass/common.h
src/core/common.c
src/pass/pass-parser.c
src/pmqos/pmqos-parser.c
src/thermal/thermal-parser.c

index b11571d81411a08ba8494f40a796f2a136a0bfc8..4f6a7aa000d900c5474572542eb1862c2124dd08 100644 (file)
@@ -92,5 +92,5 @@ typedef unsigned long long uint64;
 
 int sys_get_int(char *fname, int *val);
 int sys_get_str(char *fname, char *str);
-
+int sys_strtol(char *str);
 #endif /* __CORE_COMMON_H__ */
index 6e2150a37172cdf260e4505ef842119c501a0115..cdc25e7e56c11bdac17ea5cf77a8157a162a8c27 100644 (file)
@@ -33,6 +33,7 @@
 #include <errno.h>
 #include <poll.h>
 #include <mntent.h>
+#include <limits.h>
 
 #include <pass/log.h>
 #include <pass/common.h>
@@ -66,7 +67,10 @@ int sys_get_int(char *fname, int *val)
        int ret = 0;
 
        if (sys_read_buf(fname, buf) == 0) {
-               *val = atoi(buf);
+               ret = sys_strtol(buf);
+               if (ret < 0)
+                       return ret;
+               *val = ret;
        } else {
                *val = -1;
                ret = -EIO;
@@ -86,3 +90,16 @@ int sys_get_str(char *fname, char *str)
 
        return -1;
 }
+
+int sys_strtol(char *str)
+{
+       long value;
+
+       value = strtol(str, (char**)NULL, 10);
+       if (value > INT_MAX || value < INT_MIN) {
+               _E("%s is out of range of integer\n", str);
+               return -EINVAL;
+       }
+
+       return (int)value;
+}
index b653e76e3dc8f458b053e8ed126b4b98977c7702..856270d42c31d9afa4a8973a7360a3a2c891ffea 100644 (file)
@@ -44,8 +44,9 @@
 
 #include "pass.h"
 
-#define MAX_NUM                                255
-#define MIN_TIMEOUT_SEC                0.2
+#define MAX_NUM                        255
+#define MIN_TIMEOUT_SEC                0.2     /* 200 millisecond */
+#define MAX_TIMEOUT_SEC                3600.0  /* 1 hour */
 
 static int compare_compatible_name(char *compatible, char *path_compatible)
 {
@@ -100,6 +101,8 @@ static enum pass_state is_supported(char *value)
 static int parse_scenario(struct parse_result *result,
                                struct pass_scenario *scenario)
 {
+       int ret;
+
        if (!result || !scenario)
                return 0;
 
@@ -116,15 +119,27 @@ static int parse_scenario(struct parse_result *result,
 
        /* Parse properties for only PASS_MODULE_PMQOS */
        } else if (MATCH(result->name, "min_level")) {
-               scenario->pmqos.min_level = atoi(result->value);
+               ret = sys_strtol(result->value);
+               if (ret < 0)
+                       return ret;
+               scenario->pmqos.min_level = ret;
        } else if (MATCH(result->name, "max_level")) {
-               scenario->pmqos.max_level = atoi(result->value);
+               ret = sys_strtol(result->value);
+               if (ret < 0)
+                       return ret;
+               scenario->pmqos.max_level = ret;
 
        /* Parse properties for only PASS_MODULE_THERMAL */
        } else if (MATCH(result->name, "temperature")) {
-               scenario->thermal.temperature = atoi(result->value);
+               ret = sys_strtol(result->value);
+               if (ret < 0)
+                       return ret;
+               scenario->thermal.temperature = ret;
        } else if (MATCH(result->name, "timer_interval_ms")) {
-               scenario->thermal.timer_interval = atoi(result->value);
+               ret = sys_strtol(result->value);
+               if (ret < 0)
+                       return ret;
+               scenario->thermal.timer_interval = ret;
        }
 
        return 0;
@@ -139,6 +154,8 @@ static int parse_scenario(struct parse_result *result,
 static int parse_level(struct parse_result *result,
                                struct pass_level *level)
 {
+       int ret;
+
        if (!result || !level)
                return 0;
 
@@ -151,67 +168,129 @@ static int parse_level(struct parse_result *result,
         * - PASS_RESOURCE_BUS_ID
         * - PASS_RESOURCE_GPU_ID
         */
-       if (MATCH(result->name, "limit_max_freq"))
-               level->limit_max_freq = atoi(result->value);
-       else if (MATCH(result->name, "limit_min_freq"))
-               level->limit_min_freq = atoi(result->value);
-       else if (MATCH(result->name, "limit_min_cpu"))
-               level->limit_min_cpu = atoi(result->value);
+       if (MATCH(result->name, "limit_max_freq")) {
+               ret = sys_strtol(result->value);
+               if (ret < 0)
+                       return ret;
+               level->limit_max_freq = ret;
+       } else if (MATCH(result->name, "limit_min_freq")) {
+               ret = sys_strtol(result->value);
+               if (ret < 0)
+                       return ret;
+               level->limit_min_freq = ret;
+       } else if (MATCH(result->name, "limit_min_cpu")) {
+               ret = sys_strtol(result->value);
+               if (ret < 0)
+                       return ret;
+               level->limit_min_cpu = ret;
 
        /*
         * Properties for the following h/w resources:
         * - PASS_RESOURCE_CPU_ID
         */
-       else if (MATCH(result->name, "num_down_cond"))
-               level->num_down_cond = atoi(result->value);
-       else if (MATCH(result->name, "num_down_cond_freq"))
-               level->down_cond[0].freq = atoi(result->value);
-       else if (MATCH(result->name, "num_down_cond_nr_running"))
-               level->down_cond[0].nr_running = atoi(result->value);
-       else if (MATCH(result->name, "num_down_cond_busy_cpu"))
-               level->down_cond[0].busy_cpu = atoi(result->value);
-
-       else if (MATCH(result->name, "num_up_cond"))
-               level->num_up_cond = atoi(result->value);
-       else if (MATCH(result->name, "num_up_cond_freq"))
-               level->up_cond[0].freq = atoi(result->value);
-       else if (MATCH(result->name, "num_up_cond_nr_running"))
-               level->up_cond[0].nr_running = atoi(result->value);
-       else if (MATCH(result->name, "num_up_cond_busy_cpu"))
-               level->up_cond[0].busy_cpu = atoi(result->value);
-
-       else if (MATCH(result->name, "num_left_cond"))
-               level->num_left_cond = atoi(result->value);
-       else if (MATCH(result->name, "num_left_cond_freq"))
-               level->left_cond[0].freq = atoi(result->value);
-       else if (MATCH(result->name, "num_left_cond_nr_running"))
-               level->left_cond[0].nr_running = atoi(result->value);
-       else if (MATCH(result->name, "num_left_cond_busy_cpu"))
-               level->left_cond[0].busy_cpu = atoi(result->value);
-
-       else if (MATCH(result->name, "num_right_cond"))
-               level->num_right_cond = atoi(result->value);
-       else if (MATCH(result->name, "num_right_cond_freq"))
-               level->right_cond[0].freq = atoi(result->value);
-       else if (MATCH(result->name, "num_right_cond_nr_running"))
-               level->right_cond[0].nr_running = atoi(result->value);
-       else if (MATCH(result->name, "num_right_cond_busy_cpu"))
-               level->right_cond[0].busy_cpu = atoi(result->value);
-       else if (MATCH(result->name, "gov_timeout")) {
-               double gov_timeout = atof(result->value);
-
-               if (gov_timeout < MIN_TIMEOUT_SEC)
+       } else if (MATCH(result->name, "num_down_cond")) {
+               ret = sys_strtol(result->value);
+               if (ret < 0)
+                       return ret;
+               level->num_down_cond = ret;
+       } else if (MATCH(result->name, "num_down_cond_freq")) {
+               ret = sys_strtol(result->value);
+               if (ret < 0)
+                       return ret;
+               level->down_cond[0].freq = ret;
+       } else if (MATCH(result->name, "num_down_cond_nr_running")) {
+               ret = sys_strtol(result->value);
+               if (ret < 0)
+                       return ret;
+               level->down_cond[0].nr_running = ret;
+       } else if (MATCH(result->name, "num_down_cond_busy_cpu")) {
+               ret = sys_strtol(result->value);
+               if (ret < 0)
+                       return ret;
+               level->down_cond[0].busy_cpu = ret;
+
+       } else if (MATCH(result->name, "num_up_cond")) {
+               ret = sys_strtol(result->value);
+               if (ret < 0)
+                       return ret;
+               level->num_up_cond = ret;
+       } else if (MATCH(result->name, "num_up_cond_freq")) {
+               ret = sys_strtol(result->value);
+               if (ret < 0)
+                       return ret;
+               level->up_cond[0].freq = ret;
+       } else if (MATCH(result->name, "num_up_cond_nr_running")) {
+               ret = sys_strtol(result->value);
+               if (ret < 0)
+                       return ret;
+               level->up_cond[0].nr_running = ret;
+       } else if (MATCH(result->name, "num_up_cond_busy_cpu")) {
+               ret = sys_strtol(result->value);
+               if (ret < 0)
+                       return ret;
+               level->up_cond[0].busy_cpu = ret;
+
+       } else if (MATCH(result->name, "num_left_cond")) {
+               ret = sys_strtol(result->value);
+               if (ret < 0)
+                       return ret;
+               level->num_left_cond = ret;
+       } else if (MATCH(result->name, "num_left_cond_freq")) {
+               ret = sys_strtol(result->value);
+               if (ret < 0)
+                       return ret;
+               level->left_cond[0].freq = ret;
+       } else if (MATCH(result->name, "num_left_cond_nr_running")) {
+               ret = sys_strtol(result->value);
+               if (ret < 0)
+                       return ret;
+               level->left_cond[0].nr_running = ret;
+       } else if (MATCH(result->name, "num_left_cond_busy_cpu")) {
+               ret = sys_strtol(result->value);
+               if (ret < 0)
+                       return ret;
+               level->left_cond[0].busy_cpu = ret;
+
+       } else if (MATCH(result->name, "num_right_cond")) {
+               ret = sys_strtol(result->value);
+               if (ret < 0)
+                       return ret;
+               level->num_right_cond = ret;
+       } else if (MATCH(result->name, "num_right_cond_freq")) {
+               ret = sys_strtol(result->value);
+               if (ret < 0)
+                       return ret;
+               level->right_cond[0].freq = ret;
+       } else if (MATCH(result->name, "num_right_cond_nr_running")) {
+               ret = sys_strtol(result->value);
+               if (ret < 0)
+                       return ret;
+               level->right_cond[0].nr_running = ret;
+       } else if (MATCH(result->name, "num_right_cond_busy_cpu")) {
+               ret = sys_strtol(result->value);
+               if (ret < 0)
+                       return ret;
+               level->right_cond[0].busy_cpu = ret;
+
+       } else if (MATCH(result->name, "gov_timeout")) {
+               double gov_timeout = strtod(result->value, (char **)NULL);
+
+               if (gov_timeout < MIN_TIMEOUT_SEC
+                       || gov_timeout > MAX_TIMEOUT_SEC)
                        gov_timeout = MIN_TIMEOUT_SEC;
 
                level->gov_timeout = gov_timeout;
-       }
 
        /*
         * Properties for the following h/w resources:
         * - PASS_RESOURCE_MEMORY_ID
         */
-       else if (MATCH(result->name, "fault_around_bytes"))
-               level->fault_around_bytes = atoi(result->value);
+       } else if (MATCH(result->name, "fault_around_bytes")) {
+               ret = sys_strtol(result->value);
+               if (ret < 0)
+                       return ret;
+               level->fault_around_bytes = ret;
+       }
 
        return 0;
 }
@@ -241,8 +320,13 @@ static int parse_pmqos(struct parse_result *result, void *user_data)
 
        } else if (MATCH(result->name, "pass_num_scenarios")) {
                unsigned int num_scenarios;
+               int ret;
+
+               ret = sys_strtol(result->value);
+               if (ret < 0)
+                       return ret;
+               num_scenarios = ret;
 
-               num_scenarios = atoi(result->value);
                if (num_scenarios > MAX_NUM) {
                        _E("cannot parse %s\n", result->name);
                        return -EINVAL;
@@ -273,6 +357,7 @@ static int parse_thermal(struct parse_result *result, void *user_data)
 {
        struct pass_resource *res = user_data;
        struct pass_thermal *thermal = &res->thermal;
+       int ret;
 
        if (!result)
                return 0;
@@ -288,7 +373,11 @@ static int parse_thermal(struct parse_result *result, void *user_data)
        } else if (MATCH(result->name, "thermal_number_of_scenario")) {
                unsigned int num_scenarios;
 
-               num_scenarios = atoi(result->value);
+               ret = sys_strtol(result->value);
+               if (ret < 0)
+                       return ret;
+               num_scenarios = ret;
+
                if (num_scenarios > MAX_NUM) {
                        _E("cannot parse %s\n", result->name);
                        return -EINVAL;
@@ -304,7 +393,10 @@ static int parse_thermal(struct parse_result *result, void *user_data)
                        thermal->num_scenarios = num_scenarios;
                }
        } else if (MATCH(result->name, "thermal_timer_interval_ms")) {
-               thermal->timer_interval  = atoi(result->value);
+               ret = sys_strtol(result->value);
+               if (ret < 0)
+                       return ret;
+               thermal->timer_interval  = ret;
        }
 
        return 0;
@@ -319,6 +411,7 @@ static int parse_thermal(struct parse_result *result, void *user_data)
 static int parse_core(struct parse_result *result, void *user_data)
 {
        struct pass_resource *res = user_data;
+       int ret;
 
        if (!result)
                return 0;
@@ -326,35 +419,66 @@ static int parse_core(struct parse_result *result, void *user_data)
        if (!result->section || !result->name || !result->value)
                return 0;
 
-       if (MATCH(result->name, "pass_support"))
-               res->config_data.state = atoi(result->value);
-       else if (MATCH(result->name, "pass_gov_type"))
-               res->config_data.gov_type = atoi(result->value);
-       else if (MATCH(result->name, "pass_num_levels")) {
-               unsigned int num_levels = atoi(result->value);
+       if (MATCH(result->name, "pass_support")) {
+               ret = sys_strtol(result->value);
+               if (ret < 0)
+                       return ret;
+               res->config_data.state = ret;
+       } else if (MATCH(result->name, "pass_gov_type")) {
+               ret = sys_strtol(result->value);
+               if (ret < 0)
+                       return ret;
+               res->config_data.gov_type = ret;
+       } else if (MATCH(result->name, "pass_num_levels")) {
+               unsigned int num_levels;
+
+               ret = sys_strtol(result->value);
+               if (ret < 0)
+                       return ret;
+               num_levels = ret;
 
                if (num_levels > MAX_NUM) {
                        _E("cannot parse %s\n", result->name);
                        return -EINVAL;
                }
                res->config_data.num_levels = num_levels;
-       } else if (MATCH(result->name, "pass_min_level"))
-               res->rescon.min_level = atoi(result->value);
-       else if (MATCH(result->name, "pass_max_level"))
-               res->rescon.max_level = atoi(result->value);
-       else if (MATCH(result->name, "pass_init_level"))
-               res->rescon.init_level = atoi(result->value);
-
-       else if (MATCH(result->name, "pass_cpu_threshold"))
-               res->cpuhp.pass_cpu_threshold = atoi(result->value);
-       else if (MATCH(result->name, "pass_up_threshold"))
-               res->cpuhp.up_threshold = atoi(result->value);
-       else if (MATCH(result->name, "pass_down_threshold"))
-               res->cpuhp.down_threshold = atoi(result->value);
-       else if (MATCH(result->name, "pass_governor_timeout")) {
-               res->config_data.gov_timeout = atof(result->value);
-
-               if (MIN_TIMEOUT_SEC > res->config_data.gov_timeout)
+       } else if (MATCH(result->name, "pass_min_level")) {
+               ret = sys_strtol(result->value);
+               if (ret < 0)
+                       return ret;
+               res->rescon.min_level = ret;
+       } else if (MATCH(result->name, "pass_max_level")) {
+               ret = sys_strtol(result->value);
+               if (ret < 0)
+                       return ret;
+               res->rescon.max_level = ret;
+       } else if (MATCH(result->name, "pass_init_level")) {
+               ret = sys_strtol(result->value);
+               if (ret < 0)
+                       return ret;
+               res->rescon.init_level = ret;
+
+       } else if (MATCH(result->name, "pass_cpu_threshold")) {
+               ret = sys_strtol(result->value);
+               if (ret < 0)
+                       return ret;
+               res->cpuhp.pass_cpu_threshold = ret;
+       } else if (MATCH(result->name, "pass_up_threshold")) {
+               ret = sys_strtol(result->value);
+               if (ret < 0)
+                       return ret;
+               res->cpuhp.up_threshold = ret;
+       } else if (MATCH(result->name, "pass_down_threshold")) {
+               ret = sys_strtol(result->value);
+               if (ret < 0)
+                       return ret;
+               res->cpuhp.down_threshold = ret;
+       } else if (MATCH(result->name, "pass_governor_timeout")) {
+               res->config_data.gov_timeout
+                               = strtod(result->value, (char **)NULL);
+
+               if (res->config_data.gov_timeout < MIN_TIMEOUT_SEC
+                       || res->config_data.gov_timeout > MAX_TIMEOUT_SEC)
                        res->config_data.gov_timeout = MIN_TIMEOUT_SEC;
        }
 
@@ -486,6 +610,7 @@ static int parse_resource_data(struct parse_result *result,
        struct pass *pass = user_data;
        struct pass_resource_config_data *config_data
                                = &(pass->res[id].config_data);
+       int ret;
 
        if (!result)
                return 0;
@@ -522,7 +647,10 @@ static int parse_resource_data(struct parse_result *result,
 
                switch (res_type) {
                case PASS_RESOURCE_CPU_ID:
-                       config_data->cpu = atoi(result->value);
+                       ret = sys_strtol(result->value);
+                       if (ret < 0)
+                               return ret;
+                       config_data->cpu = ret;
                        break;
                default:
                        return -EINVAL;
@@ -532,7 +660,10 @@ static int parse_resource_data(struct parse_result *result,
 
                switch (res_type) {
                case PASS_RESOURCE_CPU_ID:
-                       config_data->num_cpus = atoi(result->value);
+                       ret = sys_strtol(result->value);
+                       if (ret < 0)
+                               return ret;
+                       config_data->num_cpus = ret;
                        break;
                default:
                        return -EINVAL;
@@ -591,8 +722,13 @@ static int parse_resource(struct parse_result *result, void *user_data)
                                is_compatible = true;
                        }
                } else if (MATCH(result->name, "pass_num_resources")) {
-                       unsigned int num_resources = atoi(result->value);
-                       int i;
+                       unsigned int num_resources;
+                       int i, ret;
+
+                       ret = sys_strtol(result->value);
+                       if (ret < 0)
+                               return ret;
+                       num_resources = ret;
 
                        if ((num_resources > MAX_NUM) ||
                                        (num_resources < 1)) {
index 168c78e3ae0c07c58ff4dc68cf9dc72ba006e6cb..ccb382d05b46c4e5b7fc83e5408972df26b3288a 100644 (file)
@@ -35,6 +35,7 @@
 #include <string.h>
 
 #include <pass/log.h>
+#include <pass/common.h>
 #include <pass/config-parser.h>
 
 #include "pmqos.h"
@@ -70,7 +71,11 @@ static int pmqos_parse_scenario(struct parse_result *result, void *user_data, un
                if (MATCH(result->name, "scenario_support"))
                        scenarios->support = is_supported(result->value);
                else if (MATCH(result->name, "scenario_num")) {
-                       int num = atoi(result->value);
+                       int num;
+
+                       num = sys_strtol(result->value);
+                       if (num < 0)
+                               return num;
 
                        if (num > MAX_NUM_OF_SCENARIOS)
                                return -EINVAL;
@@ -86,7 +91,11 @@ static int pmqos_parse_scenario(struct parse_result *result, void *user_data, un
                                scenarios->num = num;
                        }
                } else if (MATCH(result->name, "scenario_max_timeout_ms")) {
-                       int max_timeout_ms = atoi(result->value);
+                       int max_timeout_ms;
+
+                       max_timeout_ms = sys_strtol(result->value);
+                       if (max_timeout_ms < 0)
+                               return max_timeout_ms;
 
                        if (max_timeout_ms < 0) {
                                _E("failed to get maximum timeout of scenario");
index 6b3dd8d7e414a5f59fe73b0103ae7f1d587d7450..df65bb10aadd6b6f615d817e870c6f67765458ec 100644 (file)
@@ -36,6 +36,7 @@
 #include <string.h>
 
 #include <pass/log.h>
+#include <pass/common.h>
 #include <pass/config-parser.h>
 
 #include "thermal.h"
@@ -72,7 +73,11 @@ static int thermal_parse_scenario(struct parse_result *result, void *user_data,
                if (MATCH(result->name, "thermal_support"))
                        scenarios->support = is_supported(result->value);
                else if (MATCH(result->name, "thermal_number_of_scenario")) {
-                       int num = atoi(result->value);
+                       int num;
+
+                       num = sys_strtol(result->value);
+                       if (num < 0)
+                               return num;
 
                        if (num > MAX_NUM_OF_SCENARIOS)
                                return -EINVAL;