Fix some svace issues for memory leak and checking return value
[platform/core/connectivity/net-config.git] / src / utils / util.c
index 762fe24..996b2e7 100755 (executable)
@@ -30,6 +30,7 @@
 #include <sys/wait.h>
 #include <sys/stat.h>
 #include <sys/ioctl.h>
+#include <ctype.h>
 #include <vconf-keys.h>
 #include <tzplatform_config.h>
 #include <system_info.h>
@@ -62,6 +63,37 @@ static void *handle_telephony;
 static struct netconfig_headed_plugin_t *headed_plugin;
 static struct netconfig_telephony_plugin_t *telephony_plugin;
 
+static bool is_feature_checked[NETCONFIG_SUPPORTED_FEATURE_MAX] = {0, };
+static bool feature_supported[NETCONFIG_SUPPORTED_FEATURE_MAX] = {0, };
+
+gboolean netconfig_check_passphrase(const gchar *service, const char *passphrase)
+{
+       gsize length;
+
+       if (!passphrase)
+               return FALSE;
+
+       length = strlen(passphrase);
+
+       if (g_str_has_suffix(service, "psk") == TRUE) {
+               if (length == 64) {
+                       for (int i = 0; i < 64; i++)
+                               if (!isxdigit((unsigned char)passphrase[i]))
+                                       return FALSE;
+               } else if (length < 8 || length > 63)
+                       return FALSE;
+       } else if (g_str_has_suffix(service, "wep") == TRUE) {
+               if (length == 10 || length == 26) {
+                       for (int i = 0; i < length; i++)
+                               if (!isxdigit((unsigned char)passphrase[i]))
+                                       return FALSE;
+               } else if (length != 5 && length != 13)
+                       return FALSE;
+       }
+
+       return TRUE;
+}
+
 GKeyFile *netconfig_keyfile_load(const char *pathname)
 {
        GKeyFile *keyfile = NULL;
@@ -115,8 +147,10 @@ void netconfig_keyfile_save(GKeyFile *keyfile, const char *pathname)
                g_error_free(error);
        }
 
-       chmod(pathname, S_IRUSR | S_IWUSR);
-       DBG("Successfully saved keyfile %s", pathname);
+       if (chmod(pathname, S_IRUSR | S_IWUSR) < 0)
+               DBG("Failed to change mode");
+       else
+               DBG("Successfully saved keyfile %s", pathname);
 
        g_free(keydata);
 }
@@ -160,7 +194,7 @@ void netconfig_start_timer(guint msecs,
        }
 
        if ((timer_id != NULL && *timer_id != 0)) {
-               DBG("timer already is registered");
+               ERR("timer already is registered");
                return;
        }
 
@@ -288,31 +322,31 @@ void netconfig_wifi_device_picker_service_stop(void)
 
 gboolean netconfig_is_wifi_direct_on(void)
 {
-#if defined TIZEN_P2P_ENABLE
+       if (!netconfig_check_feature_supported(NETCONFIG_SUPPORTED_FEATURE_WIFI_DIRECT))
+               return FALSE;
+
        int wifi_direct_state = 0;
 
        netconfig_vconf_get_int(VCONFKEY_WIFI_DIRECT_STATE, &wifi_direct_state);
 
        DBG("Wi-Fi direct mode %d", wifi_direct_state);
        return (wifi_direct_state != 0) ? TRUE : FALSE;
-#else
-       return FALSE;
-#endif
 }
 
 gboolean netconfig_is_wifi_tethering_on(void)
 {
-#if defined TIZEN_TETHERING_ENABLE
-       int wifi_tethering_state = 0;
-
-       netconfig_vconf_get_int(VCONFKEY_MOBILE_HOTSPOT_MODE, &wifi_tethering_state);
-       DBG("Wi-Ti tethering mode %d", wifi_tethering_state);
-       if ((wifi_tethering_state & VCONFKEY_MOBILE_HOTSPOT_MODE_WIFI)
-               || (wifi_tethering_state & VCONFKEY_MOBILE_HOTSPOT_MODE_WIFI_AP)) {
-               DBG("Mobile AP is on");
-               return TRUE;
+       if (netconfig_check_feature_supported(NETCONFIG_SUPPORTED_FEATURE_TETHERING)) {
+               int wifi_tethering_state = 0;
+
+               netconfig_vconf_get_int(VCONFKEY_MOBILE_HOTSPOT_MODE, &wifi_tethering_state);
+               DBG("Wi-Ti tethering mode %d", wifi_tethering_state);
+               if ((wifi_tethering_state & VCONFKEY_MOBILE_HOTSPOT_MODE_WIFI)
+                               || (wifi_tethering_state & VCONFKEY_MOBILE_HOTSPOT_MODE_WIFI_AP)) {
+                       DBG("Mobile AP is on");
+                       return TRUE;
+               }
        }
-#endif
+
        DBG("Mobile AP is off");
        return FALSE;
 }
@@ -396,8 +430,8 @@ int netconfig_execute_file(const char *file_path,
 
                errno = 0;
                if (execve(file_path, args, envs) == -1) {
-                       strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
-                       DBG("Fail to execute command (%s)", error_buf);
+                       DBG("Fail to execute command (%s)",
+                                       strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER));
                        exit(1);
                }
        } else if (pid > 0) {
@@ -418,8 +452,8 @@ int netconfig_execute_file(const char *file_path,
                return rv;
        }
 
-       strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
-       DBG("failed to fork(%s)", error_buf);
+       DBG("failed to fork(%s)",
+               strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER));
        return -EIO;
 }
 
@@ -444,8 +478,8 @@ int netconfig_execute_cmd(const char *cmd)
 
                errno = 0;
                if (execv(args[0], args) == -1) {
-                       strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
-                       DBG("Fail to execute command (%s)", error_buf);
+                       DBG("Fail to execute command (%s)",
+                               strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER));
                        g_strfreev(args);
                        exit(1);
                }
@@ -468,8 +502,8 @@ int netconfig_execute_cmd(const char *cmd)
                return rv;
        }
 
-       strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
-       DBG("failed to fork(%s)", error_buf);
+       DBG("failed to fork(%s)",
+               strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER));
        g_strfreev(args);
 
        return -EIO;
@@ -502,7 +536,7 @@ int netconfig_execute_clatd(const char *file_path, char *const args[])
 
        state = sigaction(SIGCHLD, &act, 0);
        if (state != 0) {
-               DBG("sigaction() : %d");
+               DBG("sigaction() : %d", state);
                return -1;
        }
 
@@ -517,8 +551,8 @@ int netconfig_execute_clatd(const char *file_path, char *const args[])
 
                errno = 0;
                if (execvp(file_path, args) == -1) {
-                       strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
-                       ERR("Fail to execute command (%s)", error_buf);
+                       ERR("Fail to execute command (%s)",
+                               strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER));
                        return -1;
                }
        } else if (pid > 0) {
@@ -526,8 +560,64 @@ int netconfig_execute_clatd(const char *file_path, char *const args[])
                return rv;
        }
 
-       strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
-       DBG("failed to fork(%s)", error_buf);
+       DBG("failed to fork(%s)",
+               strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER));
+       return -EIO;
+}
+
+static void no_wait_signal_handler()
+{
+       pid_t child_pid = 0;
+       int state = 0;
+
+       child_pid = waitpid(-1, &state, WNOHANG);
+
+       DBG("child_id(%d) state(%d)", child_pid, WEXITSTATUS(state));
+}
+
+int netconfig_execute_file_no_wait(const char *file_path, char *const args[])
+{
+       pid_t pid = 0;
+       int rv = 0;
+       errno = 0;
+       register unsigned int index = 0;
+
+       struct sigaction act;
+       int state = 0;
+       char error_buf[MAX_SIZE_ERROR_BUFFER] = {0, };
+
+       act.sa_handler = no_wait_signal_handler;
+       sigemptyset(&act.sa_mask);
+       act.sa_flags = 0;
+
+       state = sigaction(SIGCHLD, &act, 0);
+       if (state != 0) {
+               DBG("sigaction() : %d", state);
+               return -1;
+       }
+
+       while (args[index] != NULL) {
+               DBG("%s", args[index]);
+               index++;
+       }
+
+       if (!(pid = fork())) {
+               DBG("pid(%d), ppid (%d)", getpid(), getppid());
+               DBG("Inside child, exec (%s) command", file_path);
+
+               errno = 0;
+               if (execvp(file_path, args) == -1) {
+                       ERR("Fail to execute command (%s)",
+                               strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER));
+                       return -1;
+               }
+       } else if (pid > 0) {
+               ERR("Successfully launched child process");
+               return rv;
+       }
+
+       DBG("failed to fork(%s)",
+               strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER));
        return -EIO;
 }
 
@@ -546,8 +636,8 @@ int __netconfig_get_interface_index(const char *interface_name)
        errno = 0;
        sock = socket(PF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
        if (sock < 0) {
-               strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
-               DBG("Failed to create socket : %s", error_buf);
+               DBG("Failed to create socket : %s",
+                       strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER));
                return -1;
        }
 
@@ -557,8 +647,8 @@ int __netconfig_get_interface_index(const char *interface_name)
        close(sock);
 
        if (result < 0) {
-               strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
-               DBG("Failed to get ifr index: %s", error_buf);
+               DBG("Failed to get ifr index: %s",
+                       strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER));
                return -1;
        }
 
@@ -606,14 +696,14 @@ int netconfig_add_route_ipv4(gchar *ip_addr, gchar *subnet, gchar *interface, gi
        sock = socket(PF_INET, SOCK_DGRAM, 0);
 
        if (sock < 0) {
-               strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
-               DBG("Failed to create socket : %s", error_buf);
+               DBG("Failed to create socket : %s",
+                       strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER));
                return -1;
        }
 
        if (ioctl(sock, SIOCADDRT, &rt) < 0) {
-               strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
-               DBG("Failed to set route address : %s", error_buf);
+               DBG("Failed to set route address : %s",
+                       strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER));
                close(sock);
                return -1;
        }
@@ -657,14 +747,14 @@ int netconfig_del_route_ipv4(gchar *ip_addr, gchar *subnet, gchar *interface, gi
        sock = socket(PF_INET, SOCK_DGRAM, 0);
 
        if (sock < 0) {
-               strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
-               DBG("Failed to create socket : %s", error_buf);
+               DBG("Failed to create socket : %s",
+                       strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER));
                return -1;
        }
 
        if (ioctl(sock, SIOCDELRT, &rt) < 0) {
-               strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
-               DBG("Failed to set route address : %s", error_buf);
+               DBG("Failed to set route address : %s",
+                       strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER));
                close(sock);
                return -1;
        }
@@ -689,16 +779,16 @@ int netconfig_add_route_ipv6(gchar *ip_addr, gchar *interface, gchar *gateway, u
 
        errno = 0;
        if (inet_pton(AF_INET6, ip_addr, &rt.rtmsg_dst) < 0) {
-               strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
-               DBG("inet_pton failed : %s", error_buf);
+               DBG("inet_pton failed : %s",
+                       strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER));
                return -1;
        }
 
        if (gateway != NULL) {
                rt.rtmsg_flags |= RTF_GATEWAY;
                if (inet_pton(AF_INET6, gateway, &rt.rtmsg_gateway) < 0) {
-                       strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
-                       DBG("inet_pton failed : %s", error_buf);
+                       DBG("inet_pton failed : %s",
+                               strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER));
                        return -1;
                }
        }
@@ -707,8 +797,8 @@ int netconfig_add_route_ipv6(gchar *ip_addr, gchar *interface, gchar *gateway, u
 
        fd = socket(AF_INET6, SOCK_DGRAM, 0);
        if (fd < 0) {
-               strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
-               DBG("Failed to create socket : %s", error_buf);
+               DBG("Failed to create socket : %s",
+                       strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER));
                return -1;
        }
 
@@ -723,8 +813,8 @@ int netconfig_add_route_ipv6(gchar *ip_addr, gchar *interface, gchar *gateway, u
        }
 
        if ((err = ioctl(fd, SIOCADDRT, &rt)) < 0) {
-               strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER);
-               DBG("Failed to add route: %s", error_buf);
+               DBG("Failed to add route: %s",
+                       strerror_r(errno, error_buf, MAX_SIZE_ERROR_BUFFER));
                close(fd);
                return -1;
        }
@@ -788,7 +878,11 @@ int netconfig_del_route_ipv6(gchar *ip_addr, gchar *interface, gchar *gateway, u
 
 gboolean handle_launch_direct(Wifi *wifi, GDBusMethodInvocation *context)
 {
-#if defined TIZEN_P2P_ENABLE
+       if (!netconfig_check_feature_supported(NETCONFIG_SUPPORTED_FEATURE_WIFI_DIRECT)) {
+               wifi_complete_launch_direct(wifi, context);
+               return TRUE;
+       }
+
        int ret = 0;
        DBG("Launch Wi-Fi direct daemon");
 
@@ -800,15 +894,11 @@ gboolean handle_launch_direct(Wifi *wifi, GDBusMethodInvocation *context)
        if (ret < 0) {
                ERR("Failed to launch Wi-Fi direct daemon");
                netconfig_error_wifi_direct_failed(context);
-               return FALSE;
+               return TRUE;
        }
 
        wifi_complete_launch_direct(wifi, context);
        return TRUE;
-#else
-       wifi_complete_launch_direct(wifi, context);
-       return FALSE;
-#endif
 }
 
 int execute_mdnsd_script(char* op)
@@ -890,7 +980,7 @@ gboolean handle_launch_mdns(Network *object, GDBusMethodInvocation *context,
        if (execute_mdnsd_script("start") < 0) {
                ERR("Failed to launch mdnsresponder daemon");
                netconfig_error_invalid_parameter(context);
-               return FALSE;
+               return TRUE;
        }
 
        mdnsd_ref_count++;
@@ -1244,3 +1334,34 @@ gboolean netconfig_get_telephony_plugin_flag()
        return netconfig_plugin_telephony_enabled;
 }
 
+bool netconfig_check_feature_supported(netconfig_supported_feature_e feature)
+{
+       const char *key = NULL;
+
+       if (!is_feature_checked[feature]) {
+               switch (feature) {
+               case NETCONFIG_SUPPORTED_FEATURE_ETHERNET:
+                       key = ETHERNET_FEATURE;
+                       break;
+               case NETCONFIG_SUPPORTED_FEATURE_TETHERING:
+                       key = TETHERING_FEATURE;
+                       break;
+               case NETCONFIG_SUPPORTED_FEATURE_WIFI_DIRECT:
+                       key = WIFI_DIRECT_FEATURE;
+                       break;
+               case NETCONFIG_SUPPORTED_FEATURE_WIFI_SOFTAP:
+                       key = WIFI_SOFTAP_FEATURE;
+                       break;
+               default:
+                       ERR("Uknown feature");
+                       return false;
+               }
+
+               if (system_info_get_platform_bool(key, &feature_supported[feature]) < 0) {
+                       ERR("Get feature is failed");
+                       return false;
+               }
+               is_feature_checked[feature] = true;
+       }
+       return feature_supported[feature];
+}