Corrected and optimized usage of fork and waitpid. 98/136898/4
authorNishant Chaprana <n.chaprana@samsung.com>
Mon, 3 Jul 2017 10:36:06 +0000 (16:06 +0530)
committerNishant Chaprana <n.chaprana@samsung.com>
Mon, 3 Jul 2017 10:43:38 +0000 (16:13 +0530)
The patch fixes below things:-
1. Do not call fork when arguments not present.
2. Do not call waitpid when fork returned pid as -1 from fork.
3. Corrected wrong english usage in function name by changing name
   of is_rule_exists => is_rule_present.

Change-Id: Ic42233a846df91cc1b7871a52b830fd59433a970
Signed-off-by: Nishant Chaprana <n.chaprana@samsung.com>
packaging/stc-manager.spec
src/helper/helper-nfacct-rule.c

index 4cbbf5e..292e5c5 100644 (file)
@@ -1,6 +1,6 @@
 Name:       stc-manager
 Summary:    STC(Smart Traffic Control) manager
-Version:    0.0.22
+Version:    0.0.23
 Release:    0
 Group:      Network & Connectivity/Other
 License:    Apache-2.0
index 5a677f7..b46b3a4 100755 (executable)
@@ -390,10 +390,11 @@ static void wait_for_rule_cmd(pid_t pid)
        pid_t ret_pid;
        char buf[BUF_SIZE_FOR_ERR] = { 0 };
 
-       if (!pid) {
+       if (!pid || pid == -1) {
                STC_LOGD("no need to wait");
                return;
        }
+
        ret_pid = waitpid(pid, &status, 0);
        if (ret_pid < 0)
                STC_LOGD("can't wait for a pid %d %d %s", pid, status,
@@ -409,7 +410,7 @@ static char* get_cmd_pos(const char *cmd_buf)
        return cmd_pos;
 }
 
-static bool is_rule_exists(const char *cmd_buf)
+static bool is_rule_present(const char *cmd_buf)
 {
        size_t buf_len;
        char *exec_buf;
@@ -436,12 +437,16 @@ static bool is_rule_exists(const char *cmd_buf)
 
 stc_error_e exec_iptables_cmd(const char *cmd_buf, pid_t *cmd_pid)
 {
+       const size_t args_number = get_args_number(cmd_buf);
+       *cmd_pid = 0;
+
+       ret_value_msg_if(args_number == 0, STC_ERROR_FAIL, "no arguments");
+
        pid_t pid = fork();
 
        if (pid == 0) {
                char *cmd;
                unsigned int i;
-               const size_t args_number = get_args_number(cmd_buf);
                char *args[args_number + 2];
                int ret;
                char *save_ptr = NULL;
@@ -450,15 +455,18 @@ stc_error_e exec_iptables_cmd(const char *cmd_buf, pid_t *cmd_pid)
                STC_LOGD("executing iptables cmd %s in forked process",
                         cmd_buf);
 
-               ret_value_msg_if(args_number == 0, STC_ERROR_FAIL, "no arguments");
-
-               if (is_rule_exists(cmd_buf)) {
-                       STC_LOGD("Rule %s already exists", cmd_buf);
+               if (is_rule_present(cmd_buf)) {
+                       STC_LOGD("Rule %s already present", cmd_buf);
                        exit(0);
                }
+
                args[0] = "iptables";
                cmd = strtok_r((char *)cmd_buf, " ", &save_ptr);
-               ret_value_msg_if(cmd == NULL, STC_ERROR_FAIL, "no arguments");
+               if (cmd == NULL) {
+                       STC_LOGE("no arguments");
+                       exit(-EINVAL);
+               }
+
                for (i = 1; i <= args_number; ++i)
                        args[i] = strtok_r(NULL, " ", &save_ptr);
 
@@ -467,7 +475,8 @@ stc_error_e exec_iptables_cmd(const char *cmd_buf, pid_t *cmd_pid)
                ret = execv(cmd, args);
                if (ret)
                        STC_LOGE("Can't execute %s: %s",
-                                cmd_buf, strerror_r(errno, buf, BUF_SIZE_FOR_ERR));
+                                cmd_buf, strerror_r(errno, buf,
+                                                    BUF_SIZE_FOR_ERR));
                exit(ret);
        }
 
@@ -477,12 +486,16 @@ stc_error_e exec_iptables_cmd(const char *cmd_buf, pid_t *cmd_pid)
 
 stc_error_e exec_ip6tables_cmd(const char *cmd_buf, pid_t *cmd_pid)
 {
+       const size_t args_number = get_args_number(cmd_buf);
+       *cmd_pid = 0;
+
+       ret_value_msg_if(args_number == 0, STC_ERROR_FAIL, "no arguments");
+
        pid_t pid = fork();
 
        if (pid == 0) {
                char *cmd;
                unsigned int i;
-               const size_t args_number = get_args_number(cmd_buf);
                char *args[args_number + 2];
                int ret;
                char *save_ptr = NULL;
@@ -491,15 +504,18 @@ stc_error_e exec_ip6tables_cmd(const char *cmd_buf, pid_t *cmd_pid)
                STC_LOGD("executing ip6tables cmd %s in forked process",
                         cmd_buf);
 
-               ret_value_msg_if(args_number == 0, STC_ERROR_FAIL, "no arguments");
-
-               if (is_rule_exists(cmd_buf)) {
-                       STC_LOGD("Rule %s already exists", cmd_buf);
+               if (is_rule_present(cmd_buf)) {
+                       STC_LOGD("Rule %s already present", cmd_buf);
                        exit(0);
                }
+
                args[0] = "ip6tables";
                cmd = strtok_r((char *)cmd_buf, " ", &save_ptr);
-               ret_value_msg_if(cmd == NULL, STC_ERROR_FAIL, "no arguments");
+               if (cmd == NULL) {
+                       STC_LOGE("no arguments");
+                       exit(-EINVAL);
+               }
+
                for (i = 1; i <= args_number; ++i)
                        args[i] = strtok_r(NULL, " ", &save_ptr);