From: Prajwal A N Date: Wed, 23 Dec 2015 04:33:29 +0000 (+0900) Subject: common: resolved secure coding errors X-Git-Tag: submit/tizen/20151229.033448^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fheads%2Fdevel%2Ftizen_2.4;p=platform%2Fcore%2Fsystem%2Fresourced.git common: resolved secure coding errors Change-Id: I5cec16ef63b09027dc02b42a3bec27780004b327 Signed-off-by: Prajwal A N --- diff --git a/src/block/block-monitor.c b/src/block/block-monitor.c index 1257d906..7a697a1a 100644 --- a/src/block/block-monitor.c +++ b/src/block/block-monitor.c @@ -241,7 +241,8 @@ static Eina_Bool block_monitor_cb(void *user_data, Ecore_Fd_Handler *fd_handler) block_logging(bmi, m->pid, label, buf); next: - close(m->fd); + if (m->fd >= 0) + close(m->fd); } return ECORE_CALLBACK_RENEW; } @@ -289,7 +290,7 @@ int register_fanotify(struct block_monitor_info *bmi) block_logging_init(bmi); return RESOURCED_ERROR_NONE; error: - if (bmi->mfd) { + if (bmi->mfd > 0) { close(bmi->mfd); bmi->mfd = 0; } diff --git a/src/common/edbus-handler.c b/src/common/edbus-handler.c index 709227c6..08e7c72e 100644 --- a/src/common/edbus-handler.c +++ b/src/common/edbus-handler.c @@ -318,9 +318,10 @@ int register_edbus_interface(struct edbus_object *object) E_DBus_Interface *get_edbus_interface(const char *path) { int i; + int pathlen = strlen(path) + 1; for (i = 0; i < ARRAY_SIZE(edbus_objects); i++) - if (!strcmp(path, edbus_objects[i].path)) + if (!strncmp(path, edbus_objects[i].path, pathlen)) return edbus_objects[i].iface; return NULL; diff --git a/src/common/filemap.c b/src/common/filemap.c index 9d24a5e9..21017da3 100644 --- a/src/common/filemap.c +++ b/src/common/filemap.c @@ -393,7 +393,7 @@ int filemap_write(struct filemap *fm, const char *key, const char *value, if (*offset) { fi = filemap_to_info(fm, offset); - if (fi && !strcmp(fi->key, key)) + if (fi && !strncmp(fi->key, key, keylen+1)) _D("fi for key %s is found using offset", fi->key); else fi = NULL; diff --git a/src/common/module.c b/src/common/module.c index 352b75ee..b43c32fc 100644 --- a/src/common/module.c +++ b/src/common/module.c @@ -53,7 +53,7 @@ const struct module_ops *find_module(const char *name) gslist_for_each_item(iter, modules_list) { module = (struct module_ops *)iter->data; - if (!strcmp(module->name, name)) + if (!strncmp(module->name, name, strlen(module->name)+1)) return module; } return NULL; diff --git a/src/common/proc-common.h b/src/common/proc-common.h index a5328366..11695407 100644 --- a/src/common/proc-common.h +++ b/src/common/proc-common.h @@ -174,7 +174,7 @@ int proc_get_appflag(const pid_t pid); static inline int equal_name_info(const char *id_a, const char *id_b) { - return !strcmp(id_a, id_b); + return !strncmp(id_a, id_b, strlen(id_b)+1); } int proc_get_svc_state(struct proc_program_info *ppi); diff --git a/src/common/procfs.c b/src/common/procfs.c index 6677e6cf..611dd92c 100644 --- a/src/common/procfs.c +++ b/src/common/procfs.c @@ -107,7 +107,7 @@ pid_t find_pid_from_cmdline(char *cmdline) continue; ret = proc_get_cmdline(pid, appname); if (ret == RESOURCED_ERROR_NONE) { - if (!strcmp(cmdline, appname)) { + if (!strncmp(cmdline, appname, strlen(appname)+1)) { foundpid = pid; break; } @@ -243,12 +243,13 @@ unsigned int proc_get_swap_free(void) { struct meminfo mi; int r; + char error_buf[256]; r = proc_get_meminfo(&mi, MEMINFO_MASK_SWAP_FREE); if (r < 0) { _E("Failed to get %s: %s", meminfo_id_to_string(MEMINFO_ID_SWAP_FREE), - strerror(-r)); + strerror_r(-r, error_buf, sizeof(error_buf))); return 0; } @@ -357,6 +358,7 @@ int proc_get_status(pid_t pid, char *buf, int len) int proc_sys_node_trigger(enum sys_node_id sys_node_id) { FILE *fp = NULL; + char error_buf[256]; if (sys_node_id >= ARRAY_SIZE(sys_node_tables)) { _E("sys_node_id[%d] is out of range.\n", sys_node_id); @@ -371,7 +373,8 @@ int proc_sys_node_trigger(enum sys_node_id sys_node_id) fp = fopen(sys_node_tables[sys_node_id].path, "w"); if (fp == NULL) { _E("Failed to open: %s: %s\n", - sys_node_tables[sys_node_id].path, strerror(errno)); + sys_node_tables[sys_node_id].path, + strerror_r(errno, error_buf, sizeof(error_buf))); sys_node_tables[sys_node_id].valid = 0; return RESOURCED_ERROR_FAIL; } diff --git a/src/common/smaps.c b/src/common/smaps.c index 22aefd2a..2139d49a 100644 --- a/src/common/smaps.c +++ b/src/common/smaps.c @@ -156,7 +156,7 @@ int smaps_get(pid_t pid, struct smaps **maps, enum smap_mask mask) &map->start, &map->end, &map->mode, &map->name); if (n == 3 && !map->name) - map->name = strdup("[anon]"); + map->name = strndup("[anon]", strlen("[anon]")); else if (n != 4) { free(map); r = -EINVAL; diff --git a/src/common/storage-helper.c b/src/common/storage-helper.c index 9e750881..03dcde49 100644 --- a/src/common/storage-helper.c +++ b/src/common/storage-helper.c @@ -45,7 +45,7 @@ bool is_mounted(const char* path) if (!fp) return ret; while ((mnt = getmntent(fp))) { - if (!strcmp(mnt->mnt_dir, path)) { + if (!strncmp(mnt->mnt_dir, path, strlen(path)+1)) { ret = true; break; } diff --git a/src/common/systemd-util.c b/src/common/systemd-util.c index a8d8cf3d..22fc69ae 100644 --- a/src/common/systemd-util.c +++ b/src/common/systemd-util.c @@ -86,7 +86,8 @@ static int systemd_get_unit_obj_path(const char *unit_name, *obj_path = strndup(path, strlen(path)); if (!*obj_path) { - _E("failed to duplicate object path: %s", strerror_r(ENOMEM, buf, sizeof(buf))); + str_err = strerror_r(ENOMEM, buf, sizeof(buf)); + _E("failed to duplicate object path: %s", str_err); *err_msg = strndup(str_err, strlen(str_err)); if (!*err_msg) _E("failed to duplicate dbus error message"); diff --git a/src/common/util.h b/src/common/util.h index a5906c79..76ee291b 100644 --- a/src/common/util.h +++ b/src/common/util.h @@ -89,7 +89,7 @@ static inline void closedirp(DIR **d) #define GBYTE_TO_KBYTE(g) ((g) << 20) #define GBYTE_TO_MBYTE(g) ((g) << 10) -#define streq(a,b) (strcmp((a),(b)) == 0) +#define streq(a,b) (strncmp((a),(b), strlen(b)+1) == 0) #define strneq(a, b, n) (strncmp((a), (b), (n)) == 0) #define strcaseeq(a,b) (strcasecmp((a),(b)) == 0) #define strncaseeq(a, b, n) (strncasecmp((a), (b), (n)) == 0) diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c index 1d177f33..b68b287b 100644 --- a/src/cpu/cpu.c +++ b/src/cpu/cpu.c @@ -159,9 +159,9 @@ static int load_cpu_config(struct parse_result *result, void *user_data) if (!result) return -EINVAL; - if (strcmp(result->section, CPU_CONF_SECTION)) + if (strncmp(result->section, CPU_CONF_SECTION, strlen(CPU_CONF_SECTION)+1)) return RESOURCED_ERROR_NO_DATA; - if (!strcmp(result->name, CPU_CONF_PREDEFINE)) { + if (!strncmp(result->name, CPU_CONF_PREDEFINE, strlen(CPU_CONF_PREDEFINE)+1)) { pid = find_pid_from_cmdline(result->value); if (pid > 0) { cpu_move_cgroup(pid, CPU_CONTROL_GROUP); @@ -170,7 +170,7 @@ static int load_cpu_config(struct parse_result *result, void *user_data) } else { _E("not found appname = %s", result->value); } - } else if (!strcmp(result->name, CPU_CONF_BOOTING)) { + } else if (!strncmp(result->name, CPU_CONF_BOOTING, strlen(CPU_CONF_BOOTING)+1)) { pid = find_pid_from_cmdline(result->value); if (pid > 0) { cpu_move_cgroup(pid, CPU_CONTROL_GROUP); @@ -178,7 +178,7 @@ static int load_cpu_config(struct parse_result *result, void *user_data) def_list.control[def_list.num++].type = SET_BOOTING; setpriority(PRIO_PROCESS, pid, CPU_BACKGROUND_PRI); } - } else if (!strcmp(result->name, CPU_CONF_WRT)) { + } else if (!strncmp(result->name, CPU_CONF_WRT, strlen(CPU_CONF_WRT)+1)) { pid = find_pid_from_cmdline(result->value); if (pid > 0) { cpu_move_cgroup(pid, CPU_CONTROL_GROUP); @@ -187,24 +187,24 @@ static int load_cpu_config(struct parse_result *result, void *user_data) setpriority(PRIO_PROCESS, pid, CPU_CONTROL_PRI); ioprio_set(IOPRIO_WHO_PROCESS, pid, IOPRIO_CLASS_IDLE << IOPRIO_CLASS_SHIFT); } - } else if (!strcmp(result->name, CPU_CONF_LAZY)) { + } else if (!strncmp(result->name, CPU_CONF_LAZY, strlen(CPU_CONF_LAZY)+1)) { pid = find_pid_from_cmdline(result->value); if (pid > 0) { def_list.control[def_list.num].pid = pid; def_list.control[def_list.num++].type = SET_LAZY; } - } else if (!strcmp(result->name, CPU_CONF_SYSTEM)) { + } else if (!strncmp(result->name, CPU_CONF_SYSTEM, strlen(CPU_CONF_SYSTEM)+1)) { pid = find_pid_from_cmdline(result->value); if (pid > 0) cpu_move_cgroup(pid, CPU_CONTROL_GROUP); - } else if (!strcmp(result->name, CPU_CONF_HOME)) { + } else if (!strncmp(result->name, CPU_CONF_HOME, strlen(CPU_CONF_HOME)+1)) { pid = find_pid_from_cmdline(result->value); if (pid > 0) { setpriority(PRIO_PROCESS, pid, CPU_HIGHAPP_PRI); def_list.control[def_list.num].pid = pid; def_list.control[def_list.num++].type = SET_BOOTING; } - } else if (!strcmp(result->name, "BACKGROUND_CPU_SHARE")) { + } else if (!strncmp(result->name, "BACKGROUND_CPU_SHARE", strlen("BACKGROUND_CPU_SHARE")+1)) { value = atoi(result->value); if (value) { cgroup_write_node(CPU_CONTROL_GROUP, CPU_SHARE, value); @@ -212,14 +212,14 @@ static int load_cpu_config(struct parse_result *result, void *user_data) } if (cpu_quota_enabled()) cgroup_write_node(CPU_CONTROL_CPUQUOTA_GROUP, CPU_SHARE, value); - } else if (!strcmp(result->name, "BACKGROUND_CPU_MAX_QUOTA")) { + } else if (!strncmp(result->name, "BACKGROUND_CPU_MAX_QUOTA", strlen("BACKGROUND_CPU_MAX_QUOTA")+1)) { value = atoi(result->value); if (value && cpu_quota_enabled()) { value *= CPU_QUOTA_PERIOD_USEC; cgroup_write_node(CPU_CONTROL_DOWNLOAD_GROUP, CPU_CONTROL_BANDWIDTH, value); } - } else if (!strcmp(result->name, "BACKGROUND_CPU_MIN_QUOTA")) { + } else if (!strncmp(result->name, "BACKGROUND_CPU_MIN_QUOTA", strlen("BACKGROUND_CPU_MIN_QUOTA")+1)) { value = atoi(result->value); if (value && cpu_quota_enabled()) { value *= CPU_QUOTA_PERIOD_USEC; diff --git a/src/heart/heart-appopt.c b/src/heart/heart-appopt.c index 6901214e..d0d3603e 100644 --- a/src/heart/heart-appopt.c +++ b/src/heart/heart-appopt.c @@ -711,13 +711,13 @@ static void heart_appopt_pkgmgr_status(void *data, DBusMessage *msg) "req_id: %s, pkgtype: %s, pkgid: %s, key: %s, val: %s", req_id, pkgtype, pkgid, key, val); - if (!strcmp(key, APPOPT_STR_START)) { - if (!strcmp(val, APPOPT_STR_INSTALL)) + if (!strncmp(key, APPOPT_STR_START, strlen(APPOPT_STR_START)+1)) { + if (!strncmp(val, APPOPT_STR_INSTALL, strlen(APPOPT_STR_INSTALL)+1)) pkg_install = 1; - else if (!strcmp(val, APPOPT_STR_UNINSTALL)) + else if (!strncmp(val, APPOPT_STR_UNINSTALL, strlen(APPOPT_STR_UNINSTALL)+1)) pkg_uninstall = 1; - } else if (!strcmp(key, APPOPT_STR_END)) { - if (!strcmp(val, APPOPT_STR_OK)) { + } else if (!strncmp(key, APPOPT_STR_END, strlen(APPOPT_STR_END)+1)) { + if (!strncmp(val, APPOPT_STR_OK, strlen(APPOPT_STR_OK)+1)) { if (pkg_install) { gettimeofday(&tv, NULL); ret = heart_appopt_enqueue_insert_cmd(pkgid, tv.tv_sec, diff --git a/src/heart/heart-battery.c b/src/heart/heart-battery.c index 3e67ac46..e79a02ac 100644 --- a/src/heart/heart-battery.c +++ b/src/heart/heart-battery.c @@ -1901,20 +1901,20 @@ static int heart_battery_config(struct parse_result *result, void *user_data) if (!result) return -EINVAL; - if (strcmp(result->section, HEART_BATTERY_CONF_SECTION)) + if (strncmp(result->section, HEART_BATTERY_CONF_SECTION, strlen(HEART_BATTERY_CONF_SECTION)+1)) return RESOURCED_ERROR_NONE; - if (!strcmp(result->name, "POWER_NORMAL_MODE")) { + if (!strncmp(result->name, "POWER_NORMAL_MODE", strlen("POWER_NORMAL_MODE")+1)) { val = atoi(result->value); if (val > 0) default_mode_spc[POWER_NORMAL_MODE] = val; _D("POWER_NORMAL_MODE SPC: %d", val); - } else if (!strcmp(result->name, "POWER_SAVING_MODE")) { + } else if (!strncmp(result->name, "POWER_SAVING_MODE", strlen("POWER_SAVING_MODE")+1)) { val = atoi(result->value); if (val > 0) default_mode_spc[POWER_SAVING_MODE] = val; _D("POWER_SAVING_MODE SPC: %d", val); - } else if (!strcmp(result->name, "ULTRA_SAVING_MODE")) { + } else if (!strncmp(result->name, "ULTRA_SAVING_MODE", strlen("ULTRA_SAVING_MODE")+1)) { val = atoi(result->value); if (val > 0) default_mode_spc[ULTRA_SAVING_MODE] = val; diff --git a/src/heart/heart-memory.c b/src/heart/heart-memory.c index 58e8639f..2aedcb13 100644 --- a/src/heart/heart-memory.c +++ b/src/heart/heart-memory.c @@ -344,7 +344,7 @@ void heart_memory_fill_array(struct logging_table_form *data, void *user_data) struct heart_memory_data *loop; loop = g_array_index(send, struct heart_memory_data *, i); - if (!strcmp(loop->appid, data->appid)) { + if (!strncmp(loop->appid, data->appid, strlen(data->appid)+1)) { md = loop; break; } @@ -1103,6 +1103,7 @@ static int heart_memory_write(char *appid, char *pkgid, struct proc_status *p_da _cleanup_free_ char *info = NULL; unsigned int pss = 0, uss = 0; int ret; + char error_buf[256]; /* For write to data crud during period */ /* write memory usage in proc_list */ @@ -1114,7 +1115,8 @@ static int heart_memory_write(char *appid, char *pkgid, struct proc_status *p_da SMAPS_MASK_SWAP)); if (ret < 0) { _E("Failed to get PID(%d) smaps: %s", - p_data->pid, strerror(-ret)); + p_data->pid, + strerror_r(-ret, error_buf, sizeof(error_buf))); return ret; } diff --git a/src/heart/heart.c b/src/heart/heart.c index ba4d4ac7..45db1fd4 100644 --- a/src/heart/heart.c +++ b/src/heart/heart.c @@ -58,7 +58,7 @@ static const struct heart_module_ops *heart_module_find(const char *name) gslist_for_each_item(iter, heart_module) { module = (struct heart_module_ops *)iter->data; - if (!strcmp(module->name, name)) + if (!strncmp(module->name, name, strlen(name)+1)) return module; } return NULL; @@ -104,14 +104,14 @@ static int heart_load_config(struct parse_result *result, void *user_data) if (!result) return -EINVAL; - if (strcmp(result->section, HEART_CONF_SECTION)) + if (strncmp(result->section, HEART_CONF_SECTION, strlen(HEART_CONF_SECTION)+1)) return RESOURCED_ERROR_FAIL; ops = heart_module_find(result->name); if (!ops) return RESOURCED_ERROR_FAIL; - if (!strcmp(result->value, "ON")) + if (!strncmp(result->value, "ON", 3)) *count = *count + 1; else heart_module_remove(ops); diff --git a/src/heart/logging.c b/src/heart/logging.c index f93eee89..042b532c 100644 --- a/src/heart/logging.c +++ b/src/heart/logging.c @@ -157,6 +157,7 @@ long logging_get_time_ms(void) static struct logging_module *logging_find_module(char *name) { int i; + int namelen = strlen(name) + 1; if (!logging_modules) return NULL; @@ -164,7 +165,7 @@ static struct logging_module *logging_find_module(char *name) for (i = 0; i < logging_modules->len; i++) { struct logging_module *module = g_array_index(logging_modules, struct logging_module *, i); - if (!strcmp(name, module->name)) { + if (!strncmp(name, module->name, namelen)) { return module; } } @@ -278,6 +279,7 @@ int logging_module_init_with_db_path(char *name, enum logging_period max_period, if (asprintf(&(module->db_path), "%s", path) < 0) { _E("asprintf failed"); + free(module->name); free(module); return RESOURCED_ERROR_OUT_OF_MEMORY; } @@ -287,6 +289,7 @@ int logging_module_init_with_db_path(char *name, enum logging_period max_period, if (pthread_mutex_init(&module->cache_mutex, NULL) < 0) { _E("%s module mutex_init failed %d", name, errno); free(module->name); + free(module->db_path); free(module); return RESOURCED_ERROR_FAIL; } @@ -296,6 +299,7 @@ int logging_module_init_with_db_path(char *name, enum logging_period max_period, if (!module->cache) { _E("g_queue_new failed"); free(module->name); + free(module->db_path); free(module); return RESOURCED_ERROR_OUT_OF_MEMORY; } @@ -617,7 +621,7 @@ int logging_get_latest_in_cache(char *name, char *appid, char **data) table = g_queue_peek_nth(module->cache, i); if (table && - !strcmp(appid, table->appid)) + !strncmp(appid, table->appid, strlen(table->appid)+1)) *data = table->data; } pthread_mutex_unlock(&(module->cache_mutex)); @@ -635,7 +639,7 @@ static void logging_cache_search(struct logging_table_form *data, struct logging /* search in cache */ /* true condition, call function */ if (search->appid) { - if (strcmp(search->appid, data->appid)) + if (strncmp(search->appid, data->appid, strlen(data->appid)+1)) return; if (search->start && search->start < data->time) @@ -644,7 +648,7 @@ static void logging_cache_search(struct logging_table_form *data, struct logging if (search->end && search->end > data->time) return; } else if (search->pkgid) { - if (strcmp(search->pkgid, data->pkgid)) + if (strncmp(search->pkgid, data->pkgid, strlen(data->pkgid)+1)) return; if (search->start && search->start < data->time) diff --git a/src/memory/memcontrol.c b/src/memory/memcontrol.c index f4dcd201..09f5313e 100644 --- a/src/memory/memcontrol.c +++ b/src/memory/memcontrol.c @@ -171,9 +171,9 @@ int memcg_get_anon_usage(struct memcg_info *mi, unsigned int *anon_usage) } while (fgets(line, BUF_MAX, f) != NULL) { if (sscanf(line, "%s %d", name, &tmp)) { - if (!strcmp(name, "inactive_anon")) { + if (!strncmp(name, "inactive_anon", strlen("inactive_anon")+1)) { inactive_anon = tmp; - } else if (!strcmp(name, "active_anon")) { + } else if (!strncmp(name, "active_anon", strlen("active_anon")+1)) { active_anon = tmp; break; } diff --git a/src/memory/vmpressure-lowmem-handler.c b/src/memory/vmpressure-lowmem-handler.c index e9d796a0..fdb7efd3 100644 --- a/src/memory/vmpressure-lowmem-handler.c +++ b/src/memory/vmpressure-lowmem-handler.c @@ -418,7 +418,7 @@ int compare_func(const struct dirent **a, const struct dirent **b) char *str_at = strrchr(fn_a, '_') + 1; char *str_bt = strrchr(fn_b, '_') + 1; - return strcmp(str_at, str_bt); + return strncmp(str_at, str_bt, strlen(str_bt)+1); } static void clear_logs(char *dir) @@ -588,9 +588,9 @@ static void lowmem_kill_victim(struct task_info *tsk, if (ret == RESOURCED_ERROR_FAIL) return; - if (!strcmp("memps", appname) || - !strcmp("crash-worker", appname) || - !strcmp("system-syspopup", appname)) { + if (!strncmp("memps", appname, strlen(appname)+1) || + !strncmp("crash-worker", appname, strlen(appname)+1) || + !strncmp("system-syspopup", appname, strlen(appname)+1)) { _E("%s(%d) was selected, skip it", appname, pid); return; } @@ -835,8 +835,11 @@ static int lowmem_get_pids_proc(GArray *pids) continue; pid = (pid_t)atoi(dentry.d_name); + if (pid < 0) + continue; + pgid = getpgid(pid); - if (!pgid) + if (pgid < 0) continue; if (proc_get_oom_score_adj(pid, &oom) < 0) { @@ -1371,10 +1374,10 @@ static int load_vip_config(struct parse_result *result, void *user_data) if (!result) return -EINVAL; - if (strcmp(result->section, MEM_VIP_SECTION)) + if (strncmp(result->section, MEM_VIP_SECTION, strlen(MEM_VIP_SECTION)+1)) return RESOURCED_ERROR_NONE; - if (!strcmp(result->name, MEM_VIP_PREDEFINE)) { + if (!strncmp(result->name, MEM_VIP_PREDEFINE, strlen(MEM_VIP_PREDEFINE)+1)) { pid = find_pid_from_cmdline(result->value); if (pid > 0) proc_set_oom_score_adj(pid, OOMADJ_SERVICE_MIN); @@ -1387,13 +1390,13 @@ static int load_mem_config(struct parse_result *result, void *user_data) if (!result) return -EINVAL; - if (strcmp(result->section, MEM_POPUP_SECTION)) + if (strncmp(result->section, MEM_POPUP_SECTION, strlen(MEM_POPUP_SECTION)+1)) return RESOURCED_ERROR_NONE; - if (!strcmp(result->name, MEM_POPUP_STRING)) { - if (!strcmp(result->value, "yes")) + if (!strncmp(result->name, MEM_POPUP_STRING, strlen(MEM_POPUP_STRING)+1)) { + if (!strncmp(result->value, "yes", strlen("yes")+1)) oom_popup_enable = 1; - else if (!strcmp(result->value, "no")) + else if (!strncmp(result->value, "no", strlen("no")+1)) oom_popup_enable = 0; } @@ -1407,42 +1410,42 @@ static int set_memory_config(const char *section_name, const struct parse_result if (!result || !section_name) return -EINVAL; - if (strcmp(result->section, section_name)) + if (strncmp(result->section, section_name, strlen(section_name)+1)) return RESOURCED_ERROR_NONE; - if (!strcmp(result->name, "ThresholdSwap")) { + if (!strncmp(result->name, "ThresholdSwap", strlen("ThresholdSwap")+1)) { int value = atoi(result->value); lowmem_memcg_set_threshold(MEMCG_MEMORY, LOWMEM_SWAP, value); - } else if (!strcmp(result->name, "ThresholdLow")) { + } else if (!strncmp(result->name, "ThresholdLow", strlen("ThresholdLow")+1)) { int value = atoi(result->value); lowmem_memcg_set_threshold(MEMCG_MEMORY, LOWMEM_LOW, value); - } else if (!strcmp(result->name, "ThresholdMedium")) { + } else if (!strncmp(result->name, "ThresholdMedium", strlen("ThresholdMedium")+1)) { int value = atoi(result->value); lowmem_memcg_set_threshold(MEMCG_MEMORY, LOWMEM_MEDIUM, value); - } else if (!strcmp(result->name, "ThresholdLeave")) { + } else if (!strncmp(result->name, "ThresholdLeave", strlen("ThresholdLeave")+1)) { int value = atoi(result->value); lowmem_memcg_set_leave_threshold(MEMCG_MEMORY, value); - } else if (!strcmp(result->name, "ForegroundRatio")) { + } else if (!strncmp(result->name, "ForegroundRatio", strlen("ForegroundRatio")+1)) { float ratio = atof(result->value); memcg_info_set_limit(memcg_tree[MEMCG_FOREGROUND]->info, ratio, totalram); - } else if (!strcmp(result->name, "ForegroundUseHierarchy")) { + } else if (!strncmp(result->name, "ForegroundUseHierarchy", strlen("ForegroundUseHierarchy")+1)) { int use_hierarchy = atoi(result->value); memcg_tree[MEMCG_FOREGROUND]->use_hierarchy = use_hierarchy; - } else if (!strcmp(result->name, "ForegroundNumCgroups")) { + } else if (!strncmp(result->name, "ForegroundNumCgroups", strlen("ForegroundNumCgroups")+1)) { int num_cgroups = atoi(result->value); - memcg_add_cgroups(memcg_tree[MEMCG_FOREGROUND], - num_cgroups); + if (num_cgroups > 0) + memcg_add_cgroups(memcg_tree[MEMCG_FOREGROUND], num_cgroups); memcg_show(memcg_tree[MEMCG_FOREGROUND]); - } else if (!strcmp(result->name, "NumMaxVictims")) { + } else if (!strncmp(result->name, "NumMaxVictims", strlen("NumMaxVictims")+1)) { int value = atoi(result->value); num_max_victims = value; - } else if (!strcmp(result->name, "ProactiveThreshold")) { + } else if (!strncmp(result->name, "ProactiveThreshold", strlen("ProactiveThreshold")+1)) { int value = atoi(result->value); proactive_threshold = value; - } else if (!strcmp(result->name, "ProactiveLeave")) { + } else if (!strncmp(result->name, "ProactiveLeave", strlen("ProactiveLeave")+1)) { int value = atoi(result->value); proactive_leave = value; - } else if (!strcmp(result->name, "DynamicThreshold")) { + } else if (!strncmp(result->name, "DynamicThreshold", strlen("DynamicThreshold")+1)) { int value = atoi(result->value); dynamic_threshold_min = value; } diff --git a/src/memps/memps.c b/src/memps/memps.c index bfe5e452..fe386c9c 100644 --- a/src/memps/memps.c +++ b/src/memps/memps.c @@ -253,10 +253,12 @@ static void get_memcg_info(void) { char buf[PATH_MAX]; _cleanup_closedir_ DIR *pdir = NULL; - struct dirent *entry; + struct dirent entry; + struct dirent *result; struct stat path_stat; long usage_swap; unsigned long usage, usage_with_swap; + int ret; _I("===================================================================="); _I("MEMORY CGROUPS USAGE INFO"); @@ -267,15 +269,15 @@ static void get_memcg_info(void) return; } - while ((entry = readdir(pdir)) != NULL) { - sprintf(buf, "%s/%s", MEMCG_PATH, entry->d_name); + while (!(ret = readdir_r(pdir, &entry, &result)) && result != NULL) { + snprintf(buf, sizeof(buf), "%s/%s", MEMCG_PATH, entry.d_name); /* If can't stat then ignore */ if (stat(buf, &path_stat) != 0) continue; /* If it's not directory or it's parent path then ignore */ if (!(S_ISDIR(path_stat.st_mode) && - strcmp(entry->d_name, ".."))) + strncmp(entry.d_name, "..", 3))) continue; usage = get_memcg_usage(buf, false); @@ -286,7 +288,7 @@ static void get_memcg_info(void) usage_swap = 0; /* Case of root cgroup in hierarchy */ - if (!strcmp(entry->d_name, ".")) + if (!strncmp(entry.d_name, ".", 2)) _I("%13s Mem %3ld MB (%6ld kB), Mem+Swap %3ld MB (%6ld kB), Swap %3ld MB (%6ld kB) \n", MEMCG_PATH, BYTE_TO_MBYTE(usage), BYTE_TO_KBYTE(usage), @@ -296,7 +298,7 @@ static void get_memcg_info(void) BYTE_TO_KBYTE(usage_swap)); else _I("memcg: %13s Mem %3ld MB (%6ld kB), Mem+Swap %3ld MB (%6ld kB), Swap %3ld MB (%6ld kB)", - entry->d_name, BYTE_TO_MBYTE(usage), + entry.d_name, BYTE_TO_MBYTE(usage), BYTE_TO_KBYTE(usage), BYTE_TO_MBYTE(usage_with_swap), BYTE_TO_KBYTE(usage_with_swap), @@ -663,7 +665,7 @@ static int show_map_all_new(void) continue; base_name = basename(cmdline); - if (base_name && !strcmp(base_name, "mem-stress")) + if (base_name && !strncmp(base_name, "mem-stress", strlen("mem-stress")+1)) continue; r = smaps_get(pid, &maps, SMAPS_MASK_DEFAULT); diff --git a/src/network/app-stat.c b/src/network/app-stat.c index 64b9c9fd..58d013f9 100644 --- a/src/network/app-stat.c +++ b/src/network/app-stat.c @@ -71,12 +71,12 @@ static gint compare_classid(gconstpointer a, gconstpointer b, if (ret) return ret; - ret = strcmp(a_key->ifname, b_key->ifname); + ret = strncmp(a_key->ifname, b_key->ifname, strlen(b_key->ifname)+1); if (ret) return ret; return (a_key->imsi && b_key->imsi) ? - strcmp(a_key->imsi, b_key->imsi) : 0; + strncmp(a_key->imsi, b_key->imsi, strlen(b_key->imsi)+1) : 0; } struct application_stat_tree *create_app_stat_tree(void) diff --git a/src/network/counter-process.c b/src/network/counter-process.c index 2452f497..e938a0b9 100644 --- a/src/network/counter-process.c +++ b/src/network/counter-process.c @@ -924,7 +924,7 @@ static void deserialize_rule(DBusMessage *msg, data_usage_selection_rule *rule, err.name, err.message); } - if (app_id && !strcmp(*app_id, null_str)) + if (app_id && !strncmp(*app_id, null_str, strlen(null_str)+1)) *app_id = NULL; dbus_error_free(&err); } @@ -980,10 +980,10 @@ static inline char *get_public_appid(const uint32_t classid) /* following value for ALL is suitable for using in statistics what's why it's not in get_app_id_by_classid */ if (classid == RESOURCED_ALL_APP_CLASSID) - return strdup(RESOURCED_ALL_APP); + return strndup(RESOURCED_ALL_APP, strlen(RESOURCED_ALL_APP)); appid = get_app_id_by_classid(classid, true); - return !appid ? strdup(UNKNOWN_APP) : appid; + return !appid ? strndup(UNKNOWN_APP, strlen(UNKNOWN_APP)) : appid; } static bool need_flush_immediatelly(sig_atomic_t state) diff --git a/src/network/datausage-common.c b/src/network/datausage-common.c index 5da4dc2e..17dd5d2e 100644 --- a/src/network/datausage-common.c +++ b/src/network/datausage-common.c @@ -1238,7 +1238,7 @@ static int compare_nfcntr(gconstpointer a, gconstpointer b, * assume it's the same as given ifname */ if (strlen(key_a->ifname) && strlen(key_b->ifname)) - return strcmp(key_a->ifname, key_b->ifname); + return strncmp(key_a->ifname, key_b->ifname, strlen(key_b->ifname)+1); return 0; } @@ -1407,7 +1407,7 @@ static gboolean fill_restriction_list(gpointer key, gpointer value, gslist_for_each_item(iter, *rst_list) { resourced_restriction_info *look_info = (resourced_restriction_info *)iter->data; - if (look_info->app_id && !strcmp(look_info->app_id, app_id) && + if (look_info->app_id && !strncmp(look_info->app_id, app_id, strlen(appid)+1) && look_info->iftype == nf_key->iftype && look_info->quota_id == nf_value->quota_id && look_info->roaming == nf_value->roaming) { diff --git a/src/network/datausage-quota-processing.c b/src/network/datausage-quota-processing.c index c5c2663d..3ed54865 100644 --- a/src/network/datausage-quota-processing.c +++ b/src/network/datausage-quota-processing.c @@ -210,7 +210,7 @@ static gint compare_quota_key(gconstpointer a, gconstpointer b, * per sim, and only afterward by appid */ if (key1->imsi_hash && key2->imsi_hash) - ret = strcmp(key1->imsi_hash, key2->imsi_hash); + ret = strncmp(key1->imsi_hash, key2->imsi_hash, strlen(key2->imsi_hash)+1); else if (!key1->imsi_hash || !key2->imsi_hash) /* in case of one empty another not */ ret = key1->imsi_hash - key2->imsi_hash; @@ -220,7 +220,7 @@ static gint compare_quota_key(gconstpointer a, gconstpointer b, } if (key1->app_id && key2->app_id) - ret = strcmp(key1->app_id, key2->app_id); + ret = strncmp(key1->app_id, key2->app_id, strlen(key2->app_id)+1); if (ret) { _D("quotas different by app_id"); return ret; @@ -386,7 +386,7 @@ static resourced_cb_ret data_usage_details_cb(const data_usage_info *info, /* if imsi is not specified, e.g. for WiFi * need additional check*/ - if (info->imsi && context->imsi && strcmp(context->imsi, info->imsi)) + if (info->imsi && context->imsi && strncmp(context->imsi, info->imsi, strlen(info->imsi)+1)) return RESOURCED_CONTINUE; context->sent_used_quota += info->cnt.outgoing_bytes; @@ -501,7 +501,7 @@ static void set_effective_quota(const char *app_id, const time_t cur_time = time(0); char buf[30]; - app_id = !strcmp(app_id, RESOURCED_ALL_APP) ? 0: app_id; + app_id = !strncmp(app_id, RESOURCED_ALL_APP, strlen(RESOURCED_ALL_APP)+1) ? 0: app_id; if (cur_time < start_time) { _D("No need to update effective quota!"); @@ -822,7 +822,7 @@ static bool skip_quota(struct quota_key *key_quota, struct quota *app_quota, return true; } - if (!strcmp(key_quota->app_id, TETHERING_APP_NAME) && + if (!strncmp(key_quota->app_id, TETHERING_APP_NAME, strlen(TETHERING_APP_NAME)+1) && (send_delta > 0 || rcv_delta > 0)) { _D("tethering"); /* in the case of tethering we send @@ -954,7 +954,7 @@ struct update_all_arg static inline bool check_imsi_hash(const char *hash_a, const char *hash_b) { if (hash_a && hash_b) - return !strcmp(hash_a, hash_b); + return !strncmp(hash_a, hash_b, strlen(hash_b)+1); return hash_a == hash_b; /* both null */ } @@ -990,7 +990,7 @@ static gboolean update_pseudo_app_entry(gpointer key, _D("app stat ground %d", arg->app_stat->ground); #endif /* handle case for network interfaces*/ - if ((!strcmp(qkey->app_id, RESOURCED_ALL_APP) && + if ((!strncmp(qkey->app_id, RESOURCED_ALL_APP, strlen(RESOURCED_ALL_APP)+1) && (qkey->iftype == RESOURCED_IFACE_UNKNOWN || qkey->iftype == RESOURCED_IFACE_ALL || qkey->iftype == arg->iftype) && @@ -998,7 +998,7 @@ static gboolean update_pseudo_app_entry(gpointer key, (qkey->roaming == RESOURCED_ROAMING_UNKNOWN || qkey->roaming == arg->app_stat->is_roaming) && check_ground_state(qkey, arg->app_stat)) || - !strcmp(qkey->app_id, TETHERING_APP_NAME)) + !strncmp(qkey->app_id, TETHERING_APP_NAME, strlen(TETHERING_APP_NAME)+1)) { /* update it */ total_quota->sent_used_quota += arg->app_stat->delta_snd; diff --git a/src/network/generic-netlink.c b/src/network/generic-netlink.c index a37e79b3..6f238bcf 100644 --- a/src/network/generic-netlink.c +++ b/src/network/generic-netlink.c @@ -120,7 +120,7 @@ static int extract_group_id(const struct rtattr *rt_na, const char *group_name, name = RTA_DATA(multicast_group_family[CTRL_ATTR_MCAST_GRP_NAME]); - if (strcmp(name, group_name)) + if (strncmp(name, group_name, strlen(group_name)+1)) return -EINVAL; *group_id = *((__u32 *)RTA_DATA( diff --git a/src/network/iface.c b/src/network/iface.c index 2de873fc..51badf91 100644 --- a/src/network/iface.c +++ b/src/network/iface.c @@ -114,7 +114,7 @@ static void keep_ifname(GSList **ifnames_list, char *ifname, int iftype) gslist_for_each_item(iter, *ifnames_list) { struct iface_status *cur = (struct iface_status *)iter->data; - if (cur->iftype == iftype && !strcmp(cur->ifname, ifname)) { + if (cur->iftype == iftype && !strncmp(cur->ifname, ifname, strlen(ifname)+1)) { cur->active = true; found = true; } @@ -205,7 +205,7 @@ static resourced_iface_type read_iftype(const char *iface) break; key_buffer = strtok_r(buffer, UEVENT_DELIM, &saveptr); value_buffer = strtok_r(NULL, UEVENT_DELIM, &saveptr); - if (key_buffer && strcmp(key_buffer, DEVTYPE_KEY) != 0) + if (key_buffer && strncmp(key_buffer, DEVTYPE_KEY, strlen(DEVTYPE_KEY)+1) != 0) continue; ret = convert_iftype(value_buffer); break; @@ -251,7 +251,7 @@ int fill_ifaces_relation(struct parse_result *result, void UNUSED *user_data) { struct iface_relation *relation; - if (strcmp(result->section, IFACES_TYPE_SECTION)) + if (strncmp(result->section, IFACES_TYPE_SECTION, strlen(IFACES_TYPE_SECTION)+1)) return RESOURCED_ERROR_NONE; relation = (struct iface_relation *)malloc(sizeof(struct iface_relation)); @@ -323,18 +323,18 @@ resourced_iface_type convert_iftype(const char *buffer) return RESOURCED_IFACE_UNKNOWN; } - if (strcmp(buffer, DATACALL_VALUE) == 0) + if (strncmp(buffer, DATACALL_VALUE, strlen(DATACALL_VALUE)+1) == 0) return RESOURCED_IFACE_DATACALL; - if (strcmp(buffer, WIFI_VALUE) == 0) + if (strncmp(buffer, WIFI_VALUE, strlen(WIFI_VALUE)+1) == 0) return RESOURCED_IFACE_WIFI; - if (strcmp(buffer, BLUETOOTH_VALUE) == 0) + if (strncmp(buffer, BLUETOOTH_VALUE, strlen(BLUETOOTH_VALUE)+1) == 0) return RESOURCED_IFACE_BLUETOOTH; - if (strcmp(buffer, WIRED_VALUE) == 0) + if (strncmp(buffer, WIRED_VALUE, strlen(WIRED_VALUE)+1) == 0) return RESOURCED_IFACE_WIRED; - if (strcmp(buffer, ALL_NET_IFACE_VALUE) == 0) + if (strncmp(buffer, ALL_NET_IFACE_VALUE, strlen(ALL_NET_IFACE_VALUE)+1) == 0) return RESOURCED_IFACE_ALL; return RESOURCED_IFACE_UNKNOWN; } @@ -377,7 +377,7 @@ resourced_iface_type get_iftype_by_name(char *name) gslist_for_each_item(iter, ifnames) { struct iface_status *value = (struct iface_status *)iter->data; - if (!strcmp(value->ifname, name)) + if (!strncmp(value->ifname, name, strlen(name)+1)) return value->iftype; } diff --git a/src/network/iptables-rule.c b/src/network/iptables-rule.c index 0916612f..9bfe4970 100644 --- a/src/network/iptables-rule.c +++ b/src/network/iptables-rule.c @@ -162,7 +162,7 @@ static struct ipt_chain *ipt_select_chain(struct ipt_context *iptc, } for (iter = iptc->chains; iter; iter = iter->next) { struct ipt_chain *chain = iter->data; - if (!strcmp(chain->name, chain_name)) { + if (!strncmp(chain->name, chain_name, strlen(chain_name)+1)) { found_chain = chain; break; } @@ -172,7 +172,7 @@ static struct ipt_chain *ipt_select_chain(struct ipt_context *iptc, found_chain = (struct ipt_chain *)malloc(sizeof(struct ipt_chain)); ret_value_msg_if(found_chain == NULL, NULL, "Not enough memory!"); memset(found_chain, 0, sizeof(struct ipt_chain)); - strcpy(found_chain->name, chain_name); + strncpy(found_chain->name, sizeof(found_chain->name) - 1, chain_name); found_chain->hooknum = hook_number; iptc->chains = g_list_append(iptc->chains, found_chain); @@ -200,7 +200,7 @@ static void recalculate_verdict(struct ipt_chain *chain, ret_msg_if(ipt_entry->jump == NULL, "Need to find jump destination."); memset(t->target.u.user.name, 0, XT_EXTENSION_MAXNAMELEN); - strcpy(t->target.u.user.name, XT_STANDARD_TARGET); + strncpy(t->target.u.user.name, XT_STANDARD_TARGET, XT_EXTENSION_MAXNAMELEN - 1); /* * Jumps can only happen in builtin chains, so we * can safely assume that they always have a header @@ -396,9 +396,10 @@ static resourced_ret_c ipt_populate_entry(struct ipt_context *iptc, /* it means not nfacct entry */ if (nfacct_name) - strcpy(e->nfacct_name, nfacct_name); + strncpy(e->nfacct_name, nfacct_name, sizeof(e->nfacct_name) - 1); else - strcpy(e->nfacct_name, "not nfacct entry"); /* for debug purpose only */ + strncpy(e->nfacct_name, "not nfacct entry", sizeof(e->nfacct_name) - 1); /* for debug purpose only */ + e->nfacct_name[sizeof(e->nfacct_name) - 1] = 0; e->verdict_type = verdict_type; if (insert_type == IPT_INSERT_APPEND) @@ -442,7 +443,7 @@ enum ipt_verdict_type reverse_target_type(int offset, struct ipt_entry *e) { struct xt_standard_target *t = (struct xt_standard_target *)ipt_get_target(e); - if (!strcmp(t->target.u.user.name, XT_STANDARD_TARGET)) { + if (!strncmp(t->target.u.user.name, XT_STANDARD_TARGET, strlen(XT_STANDARD_TARGET)+1)) { if (t->target.u.target_size != IPT_ALIGN(sizeof(struct xt_standard_target))) { _E("Mismatch target size for standard target!"); @@ -477,7 +478,7 @@ static inline bool is_last_entry(struct ipt_context *t, struct ipt_entry *e) static inline bool is_error_target(struct xt_error_target *t) { - return strcmp(t->target.u.user.name, XT_ERROR_TARGET) == 0; + return strncmp(t->target.u.user.name, XT_ERROR_TARGET, strlen(XT_ERROR_TARGET)+1) == 0; } static void clear_user_chain(struct ipt_context *table) @@ -534,7 +535,7 @@ static resourced_cb_ret populate_entry(struct resourced_ipt_entry_info *info, is_auxilary_entry = true; } else { chain_name = define_chain_name(table, entry_offset, &hook_number); - is_auxilary_entry = strcmp(t->target.u.user.name, XT_STANDARD_TARGET) == 0 && + is_auxilary_entry = strncmp(t->target.u.user.name, XT_STANDARD_TARGET, strlen(XT_STANDARD_TARGET)+1) == 0 && info->entry->target_offset == sizeof(struct ipt_entry) && info->entry->next_offset == IPTC_ENTRY_STANDARD_TARGET_SIZE && (hook_number < NF_IP_NUMHOOKS && entry_offset == table->underflow[hook_number]); @@ -579,7 +580,7 @@ typedef resourced_cb_ret (*iterate_entries_cb)(struct resourced_ipt_entry_info * static int find_nfacct_name (const struct xt_entry_match *match, char **found_name) { - if (match && !strcmp(match->u.user.name, NFACCT_MATCH_NAME)) { + if (match && !strncmp(match->u.user.name, NFACCT_MATCH_NAME, strlen(NFACCT_MATCH_NAME)+1)) { struct xt_nfacct_match_info *info = (struct xt_nfacct_match_info *)match->data; *found_name = info ? info->name: NULL; return 1; /* means stop */ @@ -642,6 +643,8 @@ static resourced_ret_c ipt_foreach(struct ipt_context *iptc, iterate_entries_cb API resourced_ret_c resourced_ipt_begin(struct ipt_context *iptc) { int ret; + char error_buf[256]; + socklen_t s = sizeof(*iptc->info); ret_value_msg_if(iptc == NULL, RESOURCED_ERROR_INVALID_PARAMETER, "Please provide iptc handle"); @@ -658,13 +661,13 @@ API resourced_ret_c resourced_ipt_begin(struct ipt_context *iptc) } } - strcpy(iptc->info->name, TABLE_NAME); + snprintf(iptc->info->name, sizeof(iptc->info->name), "%s", TABLE_NAME); ret = getsockopt(iptc->sock, IPPROTO_IP, IPT_SO_GET_INFO, iptc->info, &s); if(ret < 0) { _E("iptables support missing error %d (%s)", errno, - strerror(errno)); + strerror_r(errno, error_buf, sizeof(error_buf))); goto release_info; } @@ -730,8 +733,11 @@ static resourced_ret_c send_ipt_items(struct ipt_context *iptc, { int err = setsockopt(iptc->sock, IPPROTO_IP, IPT_SO_SET_REPLACE, r, sizeof(*r) + r->size); + char error_buf[256]; + ret_value_msg_if(err < 0, RESOURCED_ERROR_FAIL, - "Can't send iptables rules! %s [%d]", strerror(errno), + "Can't send iptables rules! %s [%d]", + strerror_r(errno, error_buf, sizeof(error_buf)), errno); return RESOURCED_ERROR_NONE; @@ -974,18 +980,18 @@ static void fill_ipt_entry(struct nfacct_rule *rule, struct ipt_entry *entry) iface_len = strlen(rule->ifname); if (dest_ifname && iface_len) { - strcpy(dest_ifname, rule->ifname); + snprintf(dest_ifname, IFNAMSIZ, "%s", rule->ifname); memset(dest_ifmask, 0xff, iface_len + 1); } - strcpy(match->u.user.name, CGROUP_MATCH_NAME); + snprintf(match->u.user.name, sizeof(match->u.user.name), "%s", CGROUP_MATCH_NAME); match->u.user.match_size = XT_CGROUP_MATCH_SIZE; memcpy(match->data, &cgroup_info, sizeof(struct xt_cgroup_info)); memcpy(entry->elems, match, XT_CGROUP_MATCH_SIZE); memset(&nfacct_info, 0, sizeof(struct xt_nfacct_match_info)); - strcpy(nfacct_info.name, rule->name); - strcpy(match->u.user.name, NFACCT_MATCH_NAME); + snprintf(nfacct_info.name, sizeof(nfacct_info.name), "%s", rule->name); + snprintf(match->u.user.name, sizeof(match->u.user.name), "%s", NFACCT_MATCH_NAME); match->u.user.match_size = XT_NFACCT_MATCH_SIZE; memcpy(match->data, &nfacct_info, sizeof(struct xt_nfacct_match_info)); @@ -1029,7 +1035,7 @@ static bool check_existence(struct nfacct_rule *rule, struct ipt_context *iptc) chain = cur_chain->data; for (cur_rule = chain->rules; cur_rule; cur_rule = cur_rule->next) { e = cur_rule->data; - if (strcmp (e->nfacct_name, rule->name) == 0) + if (strncmp(e->nfacct_name, rule->name, strlen(rule->name)+1) == 0) return true; } } @@ -1104,7 +1110,7 @@ API resourced_ret_c resourced_ipt_remove(struct nfacct_rule *rule, struct ipt_co } for (iter = chain->rules; iter; iter = iter->next) { e = iter->data; - if (!strcmp(e->nfacct_name, rule->name)) { + if (!strncmp(e->nfacct_name, rule->name, strlen(rule->name)+1)) { found_entry = e; break; } @@ -1174,7 +1180,7 @@ static void dump_target(struct ipt_entry *entry) { struct xt_entry_target *target = ipt_get_target(entry); - if (strcmp(target->u.user.name, IPT_STANDARD_TARGET) == 0) { + if (strncmp(target->u.user.name, IPT_STANDARD_TARGET, strlen(IPT_STANDARD_TARGET)+1) == 0) { struct xt_standard_target *t; t = (struct xt_standard_target *)target; @@ -1214,7 +1220,7 @@ static resourced_cb_ret dump_entry(struct resourced_ipt_entry_info *info, void * _D("entry %p next_offset %d ", info->entry, info->entry->next_offset); - if (!strcmp(target->u.user.name, IPT_ERROR_TARGET)) { + if (!strncmp(target->u.user.name, IPT_ERROR_TARGET, strlen(IPT_ERROR_TARGET)+1)) { _D("\tUSER CHAIN (%s) match %p target %p", target->data, info->entry->elems, (char *)info->entry + info->entry->target_offset); diff --git a/src/network/net-cls-cgroup.c b/src/network/net-cls-cgroup.c index 189bd334..e122c7ef 100644 --- a/src/network/net-cls-cgroup.c +++ b/src/network/net-cls-cgroup.c @@ -168,13 +168,13 @@ u_int32_t get_classid_by_app_id(const char *app_id, int create) return RESOURCED_UNKNOWN_CLASSID; } - if (!strcmp(app_id, RESOURCED_ALL_APP)) + if (!strncmp(app_id, RESOURCED_ALL_APP, strlen(RESOURCED_ALL_APP)+1)) return RESOURCED_ALL_APP_CLASSID; - if (!strcmp(app_id, TETHERING_APP_NAME)) + if (!strncmp(app_id, TETHERING_APP_NAME, strlen(TETHERING_APP_NAME)+1)) return RESOURCED_TETHERING_APP_CLASSID; - if (!strcmp(app_id, RESOURCED_BACKGROUND_APP_NAME)) + if (!strncmp(app_id, RESOURCED_BACKGROUND_APP_NAME, strlen(RESOURCED_BACKGROUND_APP_NAME)+1)) return RESOURCED_BACKGROUND_APP_CLASSID; /* just read */ @@ -359,7 +359,7 @@ API resourced_ret_c make_net_cls_cgroup_with_pid(const int pid, const char *pkg_ return RESOURCED_ERROR_INVALID_PARAMETER; } - if (!strcmp(pkg_name, RESOURCED_BACKGROUND_APP_NAME)) + if (!strncmp(pkg_name, RESOURCED_BACKGROUND_APP_NAME, strlen(RESOURCED_BACKGROUND_APP_NAME)+1)) ret = make_net_cls_cgroup(pkg_name, RESOURCED_BACKGROUND_APP_CLASSID); else ret = make_net_cls_cgroup(pkg_name, RESOURCED_UNKNOWN_CLASSID); diff --git a/src/network/options-private.c b/src/network/options-private.c index 991a424e..ff014518 100644 --- a/src/network/options-private.c +++ b/src/network/options-private.c @@ -44,10 +44,10 @@ static int fill_general_opt(struct parse_result *result, void *user_data) { struct net_counter_opts *opts = (struct net_counter_opts *)user_data; - if (strcmp(result->section, GENERAL_SECTION)) + if (strncmp(result->section, GENERAL_SECTION, strlen(GENERAL_SECTION)+1)) return RESOURCED_ERROR_NONE; - if (strcmp(result->name, NET_UPDATE_PERIOD_NAME) == 0) { + if (strncmp(result->name, NET_UPDATE_PERIOD_NAME, strlen(NET_UPDATE_PERIOD_NAME)+1) == 0) { opts->update_period = atoi(result->value); if (opts->update_period == 0) { _D("not valid value %s for %s key", result->value, @@ -58,7 +58,7 @@ static int fill_general_opt(struct parse_result *result, _D("update period is %d", opts->update_period); } - if (strcmp(result->name, NET_FLUSH_PERIOD_NAME) == 0) { + if (strncmp(result->name, NET_FLUSH_PERIOD_NAME, strlen(NET_FLUSH_PERIOD_NAME)+1) == 0) { opts->flush_period = atoi(result->value); if (opts->flush_period == 0) { _D("not valid value %s for %s key", result->value, diff --git a/src/network/restriction-handler.c b/src/network/restriction-handler.c index a3f2c381..37b359ba 100644 --- a/src/network/restriction-handler.c +++ b/src/network/restriction-handler.c @@ -90,7 +90,7 @@ static resourced_cb_ret _restriction_iter( info->app_id, context->ifindex); #ifdef MULTISIM_FEATURE_ENABLED const char *imsi_hash = get_imsi_hash(get_current_modem_imsi()); - if (imsi_hash && info->imsi && !strcmp(imsi_hash, info->imsi)) { + if (imsi_hash && info->imsi && !strncmp(imsi_hash, info->imsi, strlen(info->imsi)+1)) { gpointer data = _create_reset_restriction(info, context->ifindex); if (data) context->restrictions = g_list_prepend(context->restrictions, @@ -132,7 +132,7 @@ static bool check_current_imsi_for_restriction(resourced_iface_type iftype, const char *imsi_hash = get_imsi_hash(get_current_modem_imsi()); _SD("current imsi %s", imsi_hash); _SD("restrictions imsi %s", du_quota.imsi); - return imsi_hash && strcmp(du_quota.imsi, imsi_hash); + return imsi_hash && strncmp(du_quota.imsi, imsi_hash, strlen(imsi_hash)+1); } return false; } diff --git a/src/network/restriction-local.c b/src/network/restriction-local.c index 3140caf2..456dcc2a 100644 --- a/src/network/restriction-local.c +++ b/src/network/restriction-local.c @@ -355,7 +355,7 @@ resourced_ret_c process_kernel_restriction( static bool check_background_app(const char *app_id, const resourced_state_t state) { if (state == RESOURCED_STATE_BACKGROUND && - !strcmp(app_id, RESOURCED_BACKGROUND_APP_NAME)) { + !strncmp(app_id, RESOURCED_BACKGROUND_APP_NAME, strlen(RESOURCED_BACKGROUND_APP_NAME)+1)) { return TRUE; } return FALSE; @@ -383,7 +383,7 @@ resourced_ret_c proc_keep_restriction( app_classid = get_classid_by_app_id(app_id, rst_type != RST_UNSET); if (!skip_kernel_op) { imsi_hash = get_imsi_hash(get_current_modem_imsi()); - if (imsi_hash && rst->imsi && !strcmp(imsi_hash, rst->imsi)) { + if (imsi_hash && rst->imsi && !strncmp(imsi_hash, rst->imsi, strlen(rst->imsi)+1)) { ret = process_kernel_restriction(app_classid, rst, rst_type, quota_id); if (ret != RESOURCED_ERROR_NONE) _E("Can't keep restriction. only update the DB"); @@ -397,7 +397,7 @@ resourced_ret_c proc_keep_restriction( "imsi %s, rs_type %d\n", app_id, app_classid, store_iftype, rst_state, rst_type, rst->imsi, rst->rs_type); #endif - if (!strcmp(app_id, RESOURCED_ALL_APP) && + if (!strncmp(app_id, RESOURCED_ALL_APP, strlen(RESOURCED_ALL_APP)+1) && rst->iftype == RESOURCED_IFACE_ALL) process_net_block_state(rst_type); diff --git a/src/network/telephony.c b/src/network/telephony.c index a054eaa9..5758acc6 100644 --- a/src/network/telephony.c +++ b/src/network/telephony.c @@ -453,7 +453,7 @@ static void edbus_telephony_changed(void *data, DBusMessage *msg) dbus_message_iter_get_basic (&prop, &property); - if (strcmp(property, DBUS_TELEPHONY_ROAMING_STATUS) == 0) { + if (strncmp(property, DBUS_TELEPHONY_ROAMING_STATUS, strlen(DBUS_TELEPHONY_ROAMING_STATUS)+1) == 0) { dbus_message_iter_next(&prop); /* it's variant here, expand it */ dbus_message_iter_recurse(&prop, &bool_iter); ret_msg_if (dbus_message_iter_get_arg_type(&bool_iter) != DBUS_TYPE_BOOLEAN, @@ -462,7 +462,7 @@ static void edbus_telephony_changed(void *data, DBusMessage *msg) dbus_message_iter_get_basic (&bool_iter, &modem->roaming); _D("Roaming state for modem %s has changed", modem->name); _D("roaming state now is %d", modem->roaming); - } else if (strcmp(property, DBUS_TELEPHONY_SERVICE_TYPE) == 0) { + } else if (strncmp(property, DBUS_TELEPHONY_SERVICE_TYPE, strlen(DBUS_TELEPHONY_SERVICE_TYPE)+1) == 0) { dbus_message_iter_next(&prop); /* it's variant here, expand it */ dbus_message_iter_recurse(&prop, &bool_iter); ret_msg_if (dbus_message_iter_get_arg_type(&bool_iter) != DBUS_TYPE_INT32, @@ -603,7 +603,7 @@ char *get_imsi_hash(char *imsi) struct modem_state *modem = (struct modem_state *)iter->data; if (modem->imsi == NULL) continue; - if(!strcmp(imsi, modem->imsi)) + if(!strncmp(imsi, modem->imsi, strlen(modem->imsi)+1)) return modem->imsi_hash; } return NULL; @@ -629,7 +629,7 @@ bool check_event_in_current_modem(const char *imsi_hash, /* if we don't have current_imsi_hash * do everything as before */ return (current_imsi_hash && imsi_hash) ? - strcmp(imsi_hash, current_imsi_hash) : false; + strncmp(imsi_hash, current_imsi_hash, strlen(current_imsi_hash)+1) : false; } static void modem_free(gpointer data) diff --git a/src/proc-stat/proc-appusage.c b/src/proc-stat/proc-appusage.c index c2d5aa61..6aa94339 100644 --- a/src/proc-stat/proc-appusage.c +++ b/src/proc-stat/proc-appusage.c @@ -91,17 +91,17 @@ static int load_appusage_config(struct parse_result *result, void *user_data) if(!result) return -EINVAL; - if (strcmp(result->section, APPUSAGE_CONF_SECTION)) + if (strncmp(result->section, APPUSAGE_CONF_SECTION, strlen(APPUSAGE_CONF_SECTION)+1)) return RESOURCED_ERROR_NO_DATA; - if (!strcmp(result->name, "APPUSAGE")) { - if (!strcmp(result->value, "OFF")) + if (!strncmp(result->name, "APPUSAGE", strlen("APPUSAGE")+1)) { + if (!strncmp(result->value, "OFF", 4)) return RESOURCED_ERROR_UNINITIALIZED; appusage_favorite_htab = g_hash_table_new_full(g_str_hash, g_str_equal, free_key, NULL); - } else if (!strcmp(result->name, "PREDEFINE")) { + } else if (!strncmp(result->name, "PREDEFINE", strlen("PREDEFINE")+1)) { g_hash_table_insert(appusage_favorite_htab, g_strndup(result->value, strlen(result->value)), GINT_TO_POINTER(1)); } diff --git a/src/proc-stat/proc-info.c b/src/proc-stat/proc-info.c index 527641d2..ec2ae67a 100644 --- a/src/proc-stat/proc-info.c +++ b/src/proc-stat/proc-info.c @@ -100,6 +100,10 @@ static void *resourced_proc_info_func(void *data) pid = atoi(msg->argv[0]); send_len = atoi(msg->argv[1]); + if (pid < 0 || send_len < 0) { + _E("invalid parameters"); + goto end; + } send_buffer = calloc(1, send_len); if (send_buffer == NULL) { _E("Not enough memory"); diff --git a/src/proc-stat/proc-monitor.c b/src/proc-stat/proc-monitor.c index 984c815b..f1d7f0c4 100644 --- a/src/proc-stat/proc-monitor.c +++ b/src/proc-stat/proc-monitor.c @@ -91,6 +91,7 @@ static DBusMessage *edbus_get_meminfo(E_DBus_Object *obj, DBusMessage *msg) DBusMessage *reply; struct meminfo mi; int r; + char error_buf[256]; reply = dbus_message_new_method_return(msg); @@ -102,7 +103,8 @@ static DBusMessage *edbus_get_meminfo(E_DBus_Object *obj, DBusMessage *msg) MEMINFO_MASK_SWAP_TOTAL | MEMINFO_MASK_SWAP_FREE); if (r < 0) { - _E("Failed to get meminfo: %s", strerror(-r)); + _E("Failed to get meminfo: %s", + strerror_r(-r, error_buf, sizeof(error_buf))); return reply; } @@ -186,9 +188,9 @@ static void proc_dbus_active_signal_handler(void *data, DBusMessage *msg) return; } - if (!strcmp(str, "active")) + if (!strncmp(str, "active", strlen("active")+1)) type = PROC_CGROUP_SET_ACTIVE; - else if (!strcmp(str, "inactive")) + else if (!strncmp(str, "inactive", strlen("inactive")+1)) type = PROC_CGROUP_SET_INACTIVE; else return; diff --git a/src/proc-stat/proc-noti.c b/src/proc-stat/proc-noti.c index 3bbfcc70..cf366526 100644 --- a/src/proc-stat/proc-noti.c +++ b/src/proc-stat/proc-noti.c @@ -89,7 +89,7 @@ static inline char *recv_str(int fd) if (len <= 0) return NULL; - if (len >= INT_MAX) { + if (len >= INT_MAX - 1) { _E("size is over INT_MAX"); return NULL; } @@ -136,6 +136,7 @@ int read_message(int fd, struct resourced_noti *msg) ret_value_if(msg->type <= 0, errno); msg->argc = recv_int(fd); ret_value_if(msg->argc <= 0, errno); + ret_value_if(msg->argc > NOTI_MAXARG, RESOURCED_ERROR_FAIL); for (i = 0; i < msg->argc; ++i) { msg->argv[i] = recv_str(fd); @@ -160,6 +161,9 @@ void free_message(struct resourced_noti *msg) { int i; + if (!msg) + return; + for (i = 0; i < msg->argc; i++) internal_free(msg->argv[i]); free(msg); @@ -214,11 +218,15 @@ static Eina_Bool proc_noti_cb(void *data, Ecore_Fd_Handler *fd_handler) struct timeval tv = { 1, 0 }; /* 1 sec */ if (!ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_READ)) { - _E("ecore_main_fd_handler_active_get error , return\n"); + _E("ecore_main_fd_handler_active_get error , return"); return ECORE_CALLBACK_CANCEL; } fd = ecore_main_fd_handler_fd_get(fd_handler); + if (fd < 0) { + _E("ecore_main_fd_handler_fd_get failed"); + return ECORE_CALLBACK_CANCEL; + } msg = calloc(1, sizeof(struct resourced_noti)); if (msg == NULL) { @@ -260,6 +268,12 @@ static Eina_Bool proc_noti_cb(void *data, Ecore_Fd_Handler *fd_handler) if (msg->type >= PROC_CGROUP_GET_CMDLINE) { pid = atoi(msg->argv[0]); send_len = atoi(msg->argv[1]); + if (pid <= 0 || send_len <= 0) { + _E("invalid parameters"); + ret = -EINVAL; + safe_write_int(client_sockfd, msg->type, &ret); + goto proc_noti_renew; + } send_buffer = calloc(1, send_len); if (!send_buffer) { _E("not enough memory for calloc"); diff --git a/src/proc-stat/proc-stat.c b/src/proc-stat/proc-stat.c index 1f536a01..4f2ad3f2 100644 --- a/src/proc-stat/proc-stat.c +++ b/src/proc-stat/proc-stat.c @@ -159,6 +159,8 @@ static bool get_proc_cmdline(pid_t pid, char *cmdline) fclose(fp); return false; } + buf[sizeof(buf)-1] = 0; + fclose(fp); diff --git a/src/swap/swap.c b/src/swap/swap.c index 8a2ceabc..e90732f5 100644 --- a/src/swap/swap.c +++ b/src/swap/swap.c @@ -160,6 +160,7 @@ static pid_t swap_change_state(enum swap_state state) int status; pid_t child_pid; pid_t pid = fork(); + char error_buf[256]; if (pid < 0) { _E("failed to fork"); @@ -180,7 +181,8 @@ static pid_t swap_change_state(enum swap_state state) /* parent */ child_pid = waitpid(pid, &status, 0); if (child_pid < 0) { - _E("can't wait for a pid %d %d %s", pid, status, strerror(errno)); + _E("can't wait for a pid %d %d %s", pid, status, + strerror_r(errno, error_buf, sizeof(error_buf))); return child_pid; } @@ -854,29 +856,29 @@ static int load_swap_config(struct parse_result *result, void *user_data) if (!result) return -EINVAL; - if (strcmp(result->section, SWAP_CONTROL_SECTION)) + if (strncmp(result->section, SWAP_CONTROL_SECTION, strlen(SWAP_CONTROL_SECTION)+1)) return RESOURCED_ERROR_NO_DATA; - if (!strcmp(result->name, SWAP_CONF_STREAMS)) { + if (!strncmp(result->name, SWAP_CONF_STREAMS, strlen(SWAP_CONF_STREAMS)+1)) { int value = atoi(result->value); if (value > 0) { swap_control.max_comp_streams = value; _D("max_comp_streams of swap_control is %d", swap_control.max_comp_streams); } - } else if (!strcmp(result->name, SWAP_CONF_ALGORITHM)) { - if (!strcmp(result->value, "lzo") || - !strcmp(result->value, "lz4")) { + } else if (!strncmp(result->name, SWAP_CONF_ALGORITHM, strlen(SWAP_CONF_ALGORITHM)+1)) { + if (!strncmp(result->value, "lzo", 4) || + !strncmp(result->value, "lz4", 4)) { strncpy(swap_control.comp_algorithm, result->value, strlen(result->value) + 1); _D("comp_algorithm of swap_control is %s", result->value); } - } else if (!strcmp(result->name, SWAP_CONF_RATIO)) { + } else if (!strncmp(result->name, SWAP_CONF_RATIO, strlen(SWAP_CONF_RATIO)+1)) { float ratio = atof(result->value); swap_control.ratio = ratio; _D("swap disk size ratio is %.2f", swap_control.ratio); - } else if (!strncmp(result->name, SWAP_HARD_LIMIT, strlen(SWAP_HARD_LIMIT))) { + } else if (!strncmp(result->name, SWAP_HARD_LIMIT, strlen(SWAP_HARD_LIMIT)+1)) { limit_value = (int)strtoul(result->value, NULL, 0); if (limit_value < 0 || limit_value > 100) _E("Invalid %s value in %s file, setting %f as default percent value", diff --git a/src/timer-slack/timer-slack.c b/src/timer-slack/timer-slack.c index b9fd3796..2788e034 100644 --- a/src/timer-slack/timer-slack.c +++ b/src/timer-slack/timer-slack.c @@ -190,19 +190,19 @@ static int load_timer_config(struct parse_result *result, void *user_data) if (!result) return -EINVAL; - if (!strcmp(result->section, EXCLUDE_CONF_SECTION)) { - if (strcmp(result->name, EXCLUDE_CONF_NAME)) + if (!strncmp(result->section, EXCLUDE_CONF_SECTION, strlen(EXCLUDE_CONF_SECTION)+1)) { + if (strncmp(result->name, EXCLUDE_CONF_NAME, strlen(EXCLUDE_CONF_NAME)+1)) return RESOURCED_ERROR_NO_DATA; pid = find_pid_from_cmdline(result->value); if (pid > 0) timer_slack_write(TIMER_EXCLUDE_CGROUP, CGROUP_FILE_NAME, pid); } else { for (i = 0; i < TIMER_SLACK_MAX; i++) { - if (strcmp(result->section, timer_slack[i].name)) + if (strncmp(result->section, timer_slack[i].name, strlen(timer_slack[i].name)+1)) continue; - if (!strcmp(result->name, "timer_mode")) + if (!strncmp(result->name, "timer_mode", strlen("timer_mode")+1)) timer_slack[i].timer_mode = atoi(result->value); - if (!strcmp(result->name, "min_slack_ns")) + if (!strncmp(result->name, "min_slack_ns", strlen("min_slack_ns")+1)) timer_slack[i].slack_value = atoi(result->value); } } diff --git a/src/utils/datausage-tool.c b/src/utils/datausage-tool.c index bff2839a..b281ecd5 100644 --- a/src/utils/datausage-tool.c +++ b/src/utils/datausage-tool.c @@ -69,17 +69,17 @@ static resourced_ret_c convert_roaming(const char *str, if (!str) return RESOURCED_ERROR_INVALID_PARAMETER; - if (!strcmp(optarg, "enabled")) { + if (!strncmp(optarg, "enabled", strlen("enabled")+1)) { *roaming = RESOURCED_ROAMING_ENABLE; return RESOURCED_ERROR_NONE; } - if (!strcmp(optarg, "disabled")) { + if (!strncmp(optarg, "disabled", strlen("disabled")+1)) { *roaming = RESOURCED_ROAMING_DISABLE; return RESOURCED_ERROR_NONE; } - if (!strcmp(optarg, "unknown")) { + if (!strncmp(optarg, "unknown", strlen("unknown")+1)) { *roaming = RESOURCED_ROAMING_UNKNOWN; return RESOURCED_ERROR_NONE; } @@ -307,9 +307,9 @@ static enum run_rsml_cmd parse_cmd(int argc, char **argv, printf("options option requeres an argument."); exit(EXIT_FAILURE); } - if (optarg && strcmp(optarg, "set") == 0) + if (optarg && strncmp(optarg, "set", 4) == 0) cmd = RESOURCED_SET_OPTIONS; - else if (optarg && strcmp(optarg, "get") == 0) + else if (optarg && strncmp(optarg, "get", 4) == 0) cmd = RESOURCED_GET_OPTIONS; break; case 'q': diff --git a/src/utils/iptables-test.c b/src/utils/iptables-test.c index 80e262f2..128edb4b 100644 --- a/src/utils/iptables-test.c +++ b/src/utils/iptables-test.c @@ -42,6 +42,7 @@ int main(int argc, char *argv[]) struct ipt_context iptc = {0}; struct nfacct_rule rule; enum iptables_test_cmd cmd; + char *saveptr; if (argc <= 2) { puts(" Usage: \n"); @@ -49,11 +50,11 @@ int main(int argc, char *argv[]) exit(1); } - if (strcmp(argv[1], "i") == 0) { + if (strncmp(argv[1], "i", 2) == 0) { cmd = CMD_INSERT; - } else if (strcmp(argv[1], "a") == 0) { + } else if (strncmp(argv[1], "a", 2) == 0) { cmd = CMD_APPEND; - } else if (strcmp(argv[1], "d") == 0) { + } else if (strncmp(argv[1], "d", 2) == 0) { cmd = CMD_DELETE; } else { printf("Unknown command %s", argv[1]); @@ -61,7 +62,7 @@ int main(int argc, char *argv[]) } memset(&rule, 0, sizeof(struct nfacct_rule)); - strcpy(rule.ifname, "seth_w0"); + snprintf(rule.ifname, sizeof(rule.ifname), "seth_w0"); resourced_ipt_begin(&iptc); resourced_ipt_dump(&iptc); @@ -69,12 +70,12 @@ int main(int argc, char *argv[]) for (i = 2; i < argc; ++i) { opt = argv[i]; - sprintf(rule.name, pattern, opt); - parse = strtok(opt, "_"); + snprintf(rule.name, sizeof(rule.name), pattern, opt); + parse = strtok_r(opt, "_", &saveptr); rule.iotype = atoi(parse); - parse = strtok(NULL, "_"); + parse = strtok_r(NULL, "_", &saveptr); rule.iftype = atoi(parse); - parse = strtok(NULL, "_"); + parse = strtok_r(NULL, "_", &saveptr); rule.classid = atoi(parse); if (cmd == CMD_INSERT)