Fix svace issues for Tizen_3.0_TV_Prebeta 95/63495/2 accepted/tizen/common/20160325.135620 accepted/tizen/ivi/20160325.134213 accepted/tizen/mobile/20160325.134008 accepted/tizen/tv/20160325.134110 accepted/tizen/wearable/20160325.134152 submit/tizen/20160325.024948
authorYunmi Ha <yunmi.ha@samsung.com>
Thu, 24 Mar 2016 08:21:02 +0000 (17:21 +0900)
committerYunmi Ha <yunmi.ha@samsung.com>
Thu, 24 Mar 2016 08:40:19 +0000 (01:40 -0700)
replace thread unsafe functions
- syserror
- ttyname
- getpwnam

Change-Id: Ie7b6f62507edf33ef777c2b05cb6877dcea46778

12 files changed:
src/common/tlm-log.h [changed mode: 0644->0755]
src/common/tlm-utils.c [changed mode: 0644->0755]
src/common/tlm-utils.h [changed mode: 0644->0755]
src/daemon/dbus/tlm-dbus-server-p2p.c [changed mode: 0644->0755]
src/daemon/tlm-main.c [changed mode: 0644->0755]
src/daemon/tlm-session-remote.c [changed mode: 0644->0755]
src/plugins/default/tlm-account-plugin-default.c [changed mode: 0644->0755]
src/plugins/default/tlm-auth-plugin-default.c [changed mode: 0644->0755]
src/sessiond/main.c [changed mode: 0644->0755]
src/sessiond/tlm-auth-session.c [changed mode: 0644->0755]
src/sessiond/tlm-session.c [changed mode: 0644->0755]
src/utils/tlm-launcher.c [changed mode: 0644->0755]

old mode 100644 (file)
new mode 100755 (executable)
index 39800fb..c7bdc75
@@ -52,6 +52,8 @@ void tlm_log_close (const gchar *domain);
 #define CRITICAL(frmt, args...) g_critical(EXPAND_LOG_MSG(frmt, ##args))
 #define ERR(frmt, args...)      g_error(EXPAND_LOG_MSG(frmt, ##args))
 
+#define MAX_STRERROR_LEN    256
+
 G_END_DECLS
 
 #endif /* _TLM_LOG_H */
old mode 100644 (file)
new mode 100755 (executable)
index ee4ef33..4f0b6b2
@@ -58,64 +58,175 @@ g_clear_string (gchar **str)
     }
 }
 
-const gchar *
+gchar *
 tlm_user_get_name (uid_t user_id)
 {
     struct passwd *pwent;
+    struct passwd buf_pwent;
+    gchar *buf = NULL, *tmp = NULL, *pw_name = NULL;
+    gsize size = sysconf(_SC_GETPW_R_SIZE_MAX);
+    if (size <= sizeof(struct passwd))
+        size = 1024;
 
-    pwent = getpwuid (user_id);
-    if (!pwent)
-        return NULL;
+    for (; NULL != (tmp = g_realloc(buf, size)); size*=2)
+    {
+        buf = tmp;
+
+        if (ERANGE == getpwuid_r(user_id, &buf_pwent, buf, size, &pwent))
+            continue;
+        break;
+    }
+
+    if (pwent)
+    {
+        pw_name = g_malloc(strlen(pwent->pw_name)+1);
+        if (pw_name)
+        {
+            memset(pw_name, 0, strlen(pwent->pw_name)+1);
+            strncpy(pw_name, pwent->pw_name, strlen(pwent->pw_name));
+        }
+    }
+
+    if (buf)
+        g_free(buf);
 
-    return pwent->pw_name;
+    return pw_name;
 }
 
 uid_t
 tlm_user_get_uid (const gchar *username)
 {
     struct passwd *pwent;
+    struct passwd buf_pwent;
+    __uid_t pw_uid = -1;
+    int ret = -1;
+    gchar *buf = NULL, *tmp = NULL;
+    gsize size = sysconf(_SC_GETPW_R_SIZE_MAX);
+    if (size < sizeof(struct passwd))
+        size = 1024;
+
+    for (; NULL != (tmp = g_realloc(buf, size)); size*=2)
+    {
+        buf = tmp;
+
+        ret = getpwnam_r(username, &buf_pwent, buf, size, &pwent);
+        if (0 == ret)
+            pw_uid = pwent->pw_uid;
+        else if (ERANGE == ret)
+            continue;
+        else
+            pw_uid = -1;
+
+        break;
+    }
 
-    pwent = getpwnam (username);
-    if (!pwent)
-        return -1;
+    if (buf)
+        g_free(buf);
 
-    return pwent->pw_uid;
+    return pw_uid;
 }
 
 gid_t
 tlm_user_get_gid (const gchar *username)
 {
     struct passwd *pwent;
+    struct passwd buf_pwent;
+    __gid_t pw_gid = -1;
+    int ret = -1;
+    gchar *buf = NULL, *tmp = NULL;
+    gsize size = sysconf(_SC_GETPW_R_SIZE_MAX);
+    if (size <= sizeof(struct passwd))
+        size = 1024;
+
+    for (; NULL != (tmp = g_realloc(buf, size)); size*=2)
+    {
+        buf = tmp;
+
+        ret = getpwnam_r(username, &buf_pwent, buf, size, &pwent);
+        if (0 == ret)
+            pw_gid = pwent->pw_gid;
+        else if (ERANGE == ret)
+            continue;
+        else
+            pw_gid = -1;
 
-    pwent = getpwnam (username);
-    if (!pwent)
-        return -1;
+        break;
+    }
 
-    return pwent->pw_gid;
+    if (buf)
+        g_free(buf);
+
+    return pw_gid;
 }
 
-const gchar *
+gchar *
 tlm_user_get_home_dir (const gchar *username)
 {
     struct passwd *pwent;
+    struct passwd buf_pwent;
+    gchar *buf = NULL, *tmp = NULL, *pw_dir = NULL;
+    gsize size = sysconf(_SC_GETPW_R_SIZE_MAX);
+    if (size <= sizeof(struct passwd))
+        size = 1024;
 
-    pwent = getpwnam (username);
-    if (!pwent)
-        return NULL;
+    for (; NULL != (tmp = g_realloc(buf, size)); size*=2)
+    {
+        buf = tmp;
 
-    return pwent->pw_dir;
+        if (ERANGE == getpwnam_r(username, &buf_pwent, buf, size, &pwent))
+            continue;
+        break;
+    }
+
+    if (pwent)
+    {
+        pw_dir = g_malloc(strlen(pwent->pw_dir)+1);
+        if (pw_dir)
+        {
+            memset(pw_dir, 0, strlen(pwent->pw_dir)+1);
+            strncpy(pw_dir, pwent->pw_dir, strlen(pwent->pw_dir));
+        }
+    }
+
+    if (buf)
+        g_free(buf);
+
+    return pw_dir;
 }
 
-const gchar *
+gchar *
 tlm_user_get_shell (const gchar *username)
 {
     struct passwd *pwent;
+    struct passwd buf_pwent;
+    gchar *buf = NULL, *tmp = NULL, *pw_shell = NULL;
+    gsize size = sysconf(_SC_GETPW_R_SIZE_MAX);
+    if (size <= sizeof(struct passwd))
+        size = 1024;
 
-    pwent = getpwnam (username);
-    if (!pwent)
-        return NULL;
+    for (; NULL != (tmp = g_realloc(buf, size)); size*=2)
+    {
+        buf = tmp;
 
-    return pwent->pw_shell;
+        if (ERANGE == getpwnam_r(username, &buf_pwent, buf, size, &pwent))
+            continue;
+        break;
+    }
+
+    if (pwent)
+    {
+        pw_shell = g_malloc(strlen(pwent->pw_shell)+1);
+        if (pw_shell)
+        {
+            memset(pw_shell, 0, strlen(pwent->pw_shell)+1);
+            strncpy(pw_shell, pwent->pw_shell, strlen(pwent->pw_shell));
+        }
+    }
+
+    if (buf)
+        g_free(buf);
+
+    return pw_shell;
 }
 
 gboolean
@@ -272,12 +383,16 @@ tlm_utils_log_utmp_entry (const gchar *username)
     size_t sz_hostaddress;
     const gchar *tty_name = NULL;
     gchar *tty_no_dev_name = NULL, *tty_id = NULL;
+    gchar tty_name_buf[TTY_NAME_MAX+1] = {0,};
 
     DBG ("Log session entry to utmp/wtmp");
 
     hostname = _get_host_name ();
     sz_hostaddress = _get_host_address (hostname, &hostaddress);
-    tty_name = ttyname (0);
+
+    if (0 == ttyname_r(0, tty_name_buf, TTY_NAME_MAX+1))
+        tty_name = tty_name_buf;
+
     if (tty_name) {
         tty_no_dev_name = g_strdup (strncmp(tty_name, "/dev/", 5) == 0 ?
             tty_name + 5 : tty_name);
@@ -524,7 +639,8 @@ _add_watch (int ifd, char *file_path, WatchInfo *info) {
 
   DBG("Adding watch for file '%s' in dir '%s'", file_name, dir);
   if ((wd = inotify_add_watch (ifd, dir, IN_CREATE)) == -1) {
-    WARN ("failed to add inotify watch on %s: %s", dir, strerror (errno));
+    gchar strerr_buf[MAX_STRERROR_LEN] = {0,};
+    WARN ("failed to add inotify watch on %s: %s", dir, strerror_r(errno, strerr_buf, MAX_STRERROR_LEN));
     res = WATCH_FAILED;
     goto remove_and_return;
   }
@@ -678,7 +794,8 @@ tlm_utils_watch_for_files (
   if (!watch_list) return 0;
 
   if ((ifd = inotify_init1 (IN_NONBLOCK | IN_CLOEXEC)) < 0) {
-    WARN("Failed to start inotify: %s", strerror(errno));
+    gchar strerr_buf[MAX_STRERROR_LEN] = {0,};
+    WARN("Failed to start inotify: %s", strerror_r(errno, strerr_buf, MAX_STRERROR_LEN));
     return 0;
   }
 
old mode 100644 (file)
new mode 100755 (executable)
index 1e4234c..4c83d06
@@ -37,7 +37,7 @@ G_BEGIN_DECLS
 void
 g_clear_string (gchar **);
 
-const gchar *
+gchar *
 tlm_user_get_name (uid_t user_id);
 
 uid_t
@@ -46,10 +46,10 @@ tlm_user_get_uid (const gchar *username);
 gid_t
 tlm_user_get_gid (const gchar *username);
 
-const gchar *
+gchar *
 tlm_user_get_home_dir (const gchar *username);
 
-const gchar *
+gchar *
 tlm_user_get_shell (const gchar *username);
 
 gboolean
old mode 100644 (file)
new mode 100755 (executable)
index 1534390..5cfa3d8
@@ -455,8 +455,9 @@ tlm_dbus_server_p2p_new (
 
         if (g_mkdir_with_parents (base_path,
                 S_IRUSR |S_IWUSR |S_IXUSR |S_IXGRP |S_IXOTH) == -1) {
+            gchar strerr_buf[MAX_STRERROR_LEN] = {0,};
             WARN ("Could not create '%s', error: %s", base_path,
-                    strerror(errno));
+                    strerror_r(errno, strerr_buf, MAX_STRERROR_LEN));
             g_object_unref (server);
             server = NULL;
         }
old mode 100644 (file)
new mode 100755 (executable)
index 05c4d2f..ab74eec
@@ -82,7 +82,10 @@ static void
 _setup_unix_signal_handlers (TlmManager *manager)
 {
     if (signal (SIGINT, SIG_IGN) == SIG_ERR)
-        WARN ("failed ignore SIGINT: %s", strerror(errno));
+    {
+        gchar strerr_buf[MAX_STRERROR_LEN] = {0,};
+        WARN ("failed ignore SIGINT: %s", strerror_r(errno, strerr_buf, MAX_STRERROR_LEN));
+    }
 
     g_unix_signal_add (SIGTERM, _on_sigterm_cb, (gpointer) manager);
     g_unix_signal_add (SIGHUP, _on_sighup_cb, (gpointer) manager);
old mode 100644 (file)
new mode 100755 (executable)
index 0f27135..328cfc6
@@ -170,6 +170,7 @@ _terminate_timeout (gpointer user_data)
 {
     TlmSessionRemote *self = TLM_SESSION_REMOTE(user_data);
     TlmSessionRemotePrivate *priv = TLM_SESSION_REMOTE_PRIV(self);
+    gchar strerr_buf[MAX_STRERROR_LEN] = {0,};
 
     switch (priv->last_sig)
     {
@@ -177,18 +178,22 @@ _terminate_timeout (gpointer user_data)
             DBG ("child %u didn't respond to SIGHUP, sending SIGTERM",
                  priv->cpid);
             if (kill (priv->cpid, SIGTERM))
+            {
                 WARN ("kill(%u, SIGTERM): %s",
                       priv->cpid,
-                      strerror(errno));
+                      strerror_r(errno, strerr_buf, MAX_STRERROR_LEN));
+            }
             priv->last_sig = SIGTERM;
             return G_SOURCE_CONTINUE;
         case SIGTERM:
             DBG ("child %u didn't respond to SIGTERM, sending SIGKILL",
                  priv->cpid);
             if (kill (priv->cpid, SIGKILL))
+            {
                 WARN ("kill(%u, SIGKILL): %s",
                       priv->cpid,
-                      strerror(errno));
+                      strerror_r(errno, strerr_buf, MAX_STRERROR_LEN));
+            }
             priv->last_sig = SIGKILL;
             return G_SOURCE_CONTINUE;
         case SIGKILL:
@@ -558,7 +563,10 @@ tlm_session_remote_terminate (
 
     DBG ("Terminate child session process");
     if (kill (priv->cpid, SIGHUP) < 0)
-        WARN ("kill(%u, SIGHUP): %s", priv->cpid, strerror(errno));
+    {
+        gchar strerr_buf[MAX_STRERROR_LEN] = {0,};
+        WARN ("kill(%u, SIGHUP): %s", priv->cpid, strerror_r(errno, strerr_buf, MAX_STRERROR_LEN));
+    }
     priv->last_sig = SIGHUP;
     priv->timer_id = g_timeout_add_seconds (
             tlm_config_get_uint (priv->config, TLM_CONFIG_GENERAL,
old mode 100644 (file)
new mode 100755 (executable)
index 1195a76..f327342
@@ -25,6 +25,7 @@
 
 #include <pwd.h>
 #include <stdlib.h>
+#include <unistd.h>
 #include <errno.h>
 #include <string.h>
 #include <glib.h>
@@ -94,8 +95,13 @@ _cleanup_guest_user (TlmAccountPlugin *plugin,
                      gboolean delete)
 {
     struct passwd *pwd_entry = NULL;
-    char *command = NULL;
+    struct passwd buf_pwd;
+    gchar *command = NULL;
     int res;
+    gchar *buf = NULL, *tmp = NULL;
+    gsize size = sysconf(_SC_GETPW_R_SIZE_MAX);
+    if (size < sizeof(struct passwd))
+        size = 1024;
 
     (void) delete;
 
@@ -106,16 +112,31 @@ _cleanup_guest_user (TlmAccountPlugin *plugin,
     /* clear error */
     errno = 0;
 
-    pwd_entry = getpwnam (user_name);
+    for (; NULL != (tmp = g_realloc(buf, size)); size*=2)
+    {
+        buf = tmp;
+
+        if (ERANGE == getpwnam_r(user_name, &buf_pwd, buf, size, &pwd_entry))
+            continue;
+        break;
+    }
 
     if (!pwd_entry) {
         DBG("Could not get info for user '%s', error : %s", 
             user_name, strerror(errno));
+
+        if (buf)
+            g_free(buf);
+
         return FALSE;
     }
 
     if (!pwd_entry->pw_dir) {
         DBG("No home folder entry found for user '%s'", user_name);
+
+        if (buf)
+            g_free(buf);
+
         return FALSE;
     }
 
@@ -125,6 +146,9 @@ _cleanup_guest_user (TlmAccountPlugin *plugin,
 
     g_free (command);
 
+    if (buf)
+        g_free(buf);
+
     return res != -1;
 }
 
@@ -132,6 +156,11 @@ static gboolean
 _is_valid_user (TlmAccountPlugin *plugin, const gchar *user_name)
 {
     struct passwd *pwd_entry = NULL;
+    struct passwd pwd_buf;
+    gchar *buf = NULL, *tmp = NULL;
+    gsize size = sysconf(_SC_GETPW_R_SIZE_MAX);
+    if (size < sizeof(struct passwd))
+        size = 1024;
 
     g_return_val_if_fail (plugin, FALSE);
     g_return_val_if_fail (TLM_IS_ACCOUNT_PLUGIN_DEFAULT(plugin), FALSE);
@@ -140,14 +169,27 @@ _is_valid_user (TlmAccountPlugin *plugin, const gchar *user_name)
     /* clear error */
     errno = 0;
 
-    pwd_entry = getpwnam (user_name);
+    for (; NULL != (tmp = g_realloc(buf, size)); size*=2)
+    {
+        buf = tmp;
+
+        if (ERANGE == getpwnam_r(user_name, &pwd_buf, buf, size, &pwd_entry))
+            continue;
+        break;
+    }
 
     if (!pwd_entry) {
+        gchar strerr_buf[MAX_STRERROR_LEN] = {0,};
         DBG("Could not get info for user '%s', error : %s",
-            user_name, strerror(errno));
+            user_name, strerror_r(errno, strerr_buf, MAX_STRERROR_LEN));
+        if (buf)
+            g_free(buf);
         return FALSE;
     }
 
+    if (buf)
+        g_free(buf);
+
     return TRUE;
 }
 
old mode 100644 (file)
new mode 100755 (executable)
index c1853be..42f49a7
@@ -176,7 +176,8 @@ tlm_auth_plugin_default_init (TlmAuthPluginDefault *self)
     g_weak_ref_init (&__self, self);
 
     if (sigaction(SIGUSR1, &sa, NULL) != 0) {
-        WARN ("assert(sigaction()) : %s", strerror(errno));
+        gchar strerr_buf[MAX_STRERROR_LEN] = {0,};
+        WARN ("assert(sigaction()) : %s", strerror_r(errno, strerr_buf, MAX_STRERROR_LEN));
     }
 
     tlm_log_init("TLM_AUTH_PLUGIN");
old mode 100644 (file)
new mode 100755 (executable)
index a8ab109..d0e4db6
@@ -67,7 +67,10 @@ _install_sighandlers (GMainLoop *main_loop)
     GMainContext *ctx = g_main_loop_get_context (main_loop);
 
     if (signal (SIGINT, SIG_IGN) == SIG_ERR)
-        WARN ("failed to ignore SIGINT: %s", strerror(errno));
+    {
+        gchar strerr_buf[MAX_STRERROR_LEN] = {0,};
+        WARN ("failed to ignore SIGINT: %s", strerror_r(errno, strerr_buf, MAX_STRERROR_LEN));
+    }
 
     source = g_unix_signal_source_new (SIGTERM);
     g_source_set_callback (source,
@@ -91,13 +94,14 @@ int main (int argc, char **argv)
 {
     GMainLoop *main_loop = NULL;
     gint in_fd = 0, out_fd = 1;
+    gchar strerr_buf[MAX_STRERROR_LEN] = {0,};
 
     /* Duplicates stdin and stdout descriptors and point the descriptors
      * to /dev/null to avoid anyone writing to descriptors
      * */
     in_fd = dup(0);
     if (in_fd == -1) {
-        WARN ("Failed to dup stdin : %s(%d)", strerror(errno), errno);
+        WARN ("Failed to dup stdin : %s(%d)", strerror_r(errno, strerr_buf, MAX_STRERROR_LEN), errno);
         in_fd = 0;
     }
     if (!freopen("/dev/null", "r+", stdin)) {
@@ -106,7 +110,7 @@ int main (int argc, char **argv)
 
     out_fd = dup(1);
     if (out_fd == -1) {
-        WARN ("Failed to dup stdout : %s(%d)", strerror(errno), errno);
+        WARN ("Failed to dup stdout : %s(%d)", strerror_r(errno, strerr_buf, MAX_STRERROR_LEN), errno);
         out_fd = 1;
     }
 
old mode 100644 (file)
new mode 100755 (executable)
index 484bced..ccaeabb
@@ -348,7 +348,8 @@ tlm_auth_session_authenticate (TlmAuthSession *auth_session, GError **error)
 {
     int res;
     const char *pam_tty = NULL;
-    const char *pam_ruser = NULL;
+    char *pam_ruser = NULL;
+    gchar tty_name[TTY_NAME_MAX+1] = {0,};
     g_return_val_if_fail (auth_session &&
                 TLM_IS_AUTH_SESSION(auth_session), FALSE);
 
@@ -356,7 +357,10 @@ tlm_auth_session_authenticate (TlmAuthSession *auth_session, GError **error)
 
     pam_tty = getenv ("DISPLAY");
     if (!pam_tty)
-        pam_tty = ttyname (0);
+    {
+        if (0 == ttyname_r(0, tty_name, TTY_NAME_MAX+1))
+            pam_tty = tty_name;
+    }
     if (!pam_tty)
         pam_tty = priv->tty_name;
     if (pam_tty) {
@@ -370,6 +374,8 @@ tlm_auth_session_authenticate (TlmAuthSession *auth_session, GError **error)
     if (pam_set_item (priv->pam_handle, PAM_RUSER, pam_ruser) != PAM_SUCCESS) {
         WARN ("pam_set_item(PAM_RUSER, '%s')", pam_ruser);
     }
+    if (pam_ruser)
+        g_free(pam_ruser);
 
     if (pam_set_item (priv->pam_handle, PAM_RHOST, "localhost") !=
         PAM_SUCCESS) {
old mode 100644 (file)
new mode 100755 (executable)
index b3ee939..7c8c08c
@@ -297,12 +297,17 @@ _prepare_terminal (TlmSessionPrivate *priv)
 {
     int tty_fd = -1;
     struct stat tty_stat;
+    gchar strerr_buf[MAX_STRERROR_LEN] = {0,};
 
     DBG ("VTNR is %u", priv->vtnr);
     if (priv->vtnr > 0) {
         priv->tty_dev = g_strdup_printf ("/dev/tty%u", priv->vtnr);
     } else {
-        priv->tty_dev = g_strdup (ttyname (0));
+        gchar tty_name[TTY_NAME_MAX+1] = {0,};
+        if (0 == ttyname_r(0, tty_name, TTY_NAME_MAX+1))
+            priv->tty_dev = g_strdup (tty_name);
+        else
+                   priv->tty_dev = NULL;
     }
     DBG ("trying to setup TTY '%s'", priv->tty_dev);
     if (!priv->tty_dev) {
@@ -310,11 +315,11 @@ _prepare_terminal (TlmSessionPrivate *priv)
         goto term_exit;
     }
     if (access (priv->tty_dev, R_OK|W_OK)) {
-        WARN ("TTY not accessible: %s", strerror(errno));
+        WARN ("TTY not accessible: %s", strerror_r(errno, strerr_buf, MAX_STRERROR_LEN));
         goto term_exit;
     }
     if (lstat (priv->tty_dev, &tty_stat)) {
-        WARN ("lstat() failed: %s", strerror(errno));
+        WARN ("lstat() failed: %s", strerror_r(errno, strerr_buf, MAX_STRERROR_LEN));
         goto term_exit;
     }
     if (tty_stat.st_nlink > 1 ||
@@ -326,7 +331,7 @@ _prepare_terminal (TlmSessionPrivate *priv)
 
     tty_fd = open (priv->tty_dev, O_RDWR | O_NONBLOCK);
     if (tty_fd < 0) {
-        WARN ("open() failed: %s", strerror(errno));
+        WARN ("open() failed: %s", strerror_r(errno, strerr_buf, MAX_STRERROR_LEN));
         goto term_exit;
     }
     if (!isatty (tty_fd)) {
@@ -342,14 +347,14 @@ _prepare_terminal (TlmSessionPrivate *priv)
         priv->tty_gid = 0;
     }
     if (ioctl (tty_fd, TCGETS, &priv->tty_state) < 0)
-        WARN ("ioctl(TCGETS) failed: %s", strerror(errno));
+        WARN ("ioctl(TCGETS) failed: %s", strerror_r(errno, strerr_buf, MAX_STRERROR_LEN));
 
     if (fchown (tty_fd, tlm_user_get_uid (priv->username), -1)) {
         WARN ("Changing TTY access rights failed");
     }
 
     if (ioctl(tty_fd, KDGKBMODE, &priv->kb_mode) < 0) {
-        DBG ("ioctl(KDGKBMODE get) failed: %s", strerror(errno));
+        DBG("ioctl(KDGKBMODE get) failed: %s", strerror_r(errno, strerr_buf, MAX_STRERROR_LEN));
     } else {
         DBG ("ioctl(KDGKBMODE get) val: %d", priv->kb_mode);
     }
@@ -358,6 +363,7 @@ _prepare_terminal (TlmSessionPrivate *priv)
 
 term_exit:
     g_clear_string (&priv->tty_dev);
+
     return -1;
 }
 
@@ -365,16 +371,17 @@ static void
 _setup_terminal (TlmSessionPrivate *priv, int tty_fd)
 {
     pid_t tty_pgid;
+    gchar strerr_buf[MAX_STRERROR_LEN] = {0,};
 
     if (ioctl (tty_fd, TIOCSCTTY, 1) < 0)
-        WARN ("ioctl(TIOCSCTTY) failed: %s", strerror(errno));
+        WARN ("ioctl(TIOCSCTTY) failed: %s", strerror_r(errno, strerr_buf, MAX_STRERROR_LEN));
     tty_pgid = getpgid (getpid ());
     if (ioctl (tty_fd, TIOCSPGRP, &tty_pgid) < 0) {
-        WARN ("ioctl(TIOCSPGRP) failed: %s", strerror(errno));
+        WARN ("ioctl(TIOCSPGRP) failed: %s", strerror_r(errno, strerr_buf, MAX_STRERROR_LEN));
     }
 
     if (ioctl (tty_fd, KDSKBMODE, K_OFF) < 0) {
-        DBG ("ioctl(KDSKBMODE set) failed: %s", strerror(errno));
+        DBG ("ioctl(KDSKBMODE set) failed: %s", strerror_r(errno, strerr_buf, MAX_STRERROR_LEN));
     }
 
     dup2 (tty_fd, 0);
@@ -386,26 +393,28 @@ static void
 _reset_terminal (TlmSessionPrivate *priv)
 {
     int tty_fd = -1;
+    gchar strerr_buf[MAX_STRERROR_LEN] = {0,};
 
     if (!priv->tty_dev)
         return;
 
     tty_fd = open (priv->tty_dev, O_RDWR | O_NONBLOCK);
     if (tty_fd < 0) {
-        WARN ("open() failed: %s", strerror(errno));
+        WARN ("open() failed: %s", strerror_r(errno, strerr_buf, MAX_STRERROR_LEN));
         goto reset_exit;
     }
 
     if (priv->kb_mode >= 0 &&
         ioctl (tty_fd, KDSKBMODE, priv->kb_mode) < 0) {
-        DBG ("ioctl(KDSKBMODE reset) failed: %s", strerror(errno));
+        DBG ("ioctl(KDSKBMODE reset) failed: %s", strerror_r(errno, strerr_buf, MAX_STRERROR_LEN));
     }
     priv->kb_mode = -1;
 
     if (ioctl (tty_fd, TCFLSH, TCIOFLUSH) < 0)
-        DBG ("ioctl(TCFLSH) failed: %s", strerror(errno));
+        DBG ("ioctl(TCFLSH) failed: %s", strerror_r(errno, strerr_buf, MAX_STRERROR_LEN));
+
     if (ioctl (tty_fd, TCSETS, &priv->tty_state) < 0)
-        DBG ("ioctl(TCSETSF) failed: %s", strerror(errno));
+        DBG ("ioctl(TCSETSF) failed: %s", strerror_r(errno, strerr_buf, MAX_STRERROR_LEN));
 
     if (fchown (tty_fd, priv->tty_uid, priv->tty_gid))
         WARN ("Changing TTY access rights failed");
@@ -420,7 +429,7 @@ static gboolean
 _set_environment (TlmSessionPrivate *priv)
 {
        gchar **envlist = tlm_auth_session_get_envlist(priv->auth_session);
-       const gchar *home_dir = NULL, *shell = NULL;
+    gchar *home_dir = NULL, *shell = NULL;
 
     if (envlist) {
         gchar **env = 0;
@@ -442,9 +451,17 @@ _set_environment (TlmSessionPrivate *priv)
     _setenv_to_session ("USER", priv->username, priv);
     _setenv_to_session ("LOGNAME", priv->username, priv);
     home_dir = tlm_user_get_home_dir (priv->username);
-    if (home_dir) _setenv_to_session ("HOME", home_dir, priv);
+    if (home_dir)
+    {
+        _setenv_to_session ("HOME", home_dir, priv);
+        g_free(home_dir);
+    }
     shell = tlm_user_get_shell (priv->username);
-    if (shell) _setenv_to_session ("SHELL", shell, priv);
+    if (shell)
+    {
+        _setenv_to_session ("SHELL", shell, priv);
+        g_free(shell);
+    }
 
     if (!tlm_config_has_key (priv->config,
                              TLM_CONFIG_GENERAL,
@@ -539,6 +556,7 @@ _exec_user_session (
     gchar **args = NULL;
     gchar **args_iter = NULL;
     TlmSessionPrivate *priv = session->priv;
+    gchar strerr_buf[MAX_STRERROR_LEN] = {0,};
 
     priv = session->priv;
     if (!priv->username)
@@ -584,9 +602,9 @@ _exec_user_session (
         if (chown (priv->xdg_runtime_dir,
                tlm_user_get_uid (priv->username),
                tlm_user_get_gid (priv->username)))
-            WARN ("chown(\"%s\"): %s", priv->xdg_runtime_dir, strerror(errno));
+            WARN ("chown(\"%s\"): %s", priv->xdg_runtime_dir, strerror_r(errno, strerr_buf, MAX_STRERROR_LEN));
         if (chmod (priv->xdg_runtime_dir, rtdir_perm))
-            WARN ("chmod(\"%s\"): %s", priv->xdg_runtime_dir, strerror(errno));
+            WARN ("chmod(\"%s\"): %s", priv->xdg_runtime_dir, strerror_r(errno, strerr_buf, MAX_STRERROR_LEN));
     } else {
         DBG ("not setting up XDG_RUNTIME_DIR");
     }
@@ -636,7 +654,7 @@ _exec_user_session (
     for (fd = 3; fd < open_max; fd++) {
         if (fcntl (fd, F_SETFD, FD_CLOEXEC) < -1) {
             WARN ("Failed to close desriptor '%d', error: %s",
-                fd, strerror(errno));
+                fd, strerror_r(errno, strerr_buf, MAX_STRERROR_LEN));
         }
     }
 
@@ -653,7 +671,7 @@ _exec_user_session (
 
     DBG ("old pgid=%u", getpgrp ());
     if (setsid () == (pid_t) -1)
-        WARN ("setsid() failed: %s", strerror (errno));
+        WARN ("setsid() failed: %s", strerror_r(errno, strerr_buf, MAX_STRERROR_LEN));
     DBG ("new pgid=%u", getpgrp());
 
     if (setup_terminal) {
@@ -662,11 +680,11 @@ _exec_user_session (
     }
 
     if (initgroups (priv->username, target_gid))
-        WARN ("initgroups() failed: %s", strerror(errno));
+        WARN ("initgroups() failed: %s", strerror_r(errno, strerr_buf, MAX_STRERROR_LEN));
     if (setregid (target_gid, target_gid))
-        WARN ("setregid() failed: %s", strerror(errno));
+        WARN ("setregid() failed: %s", strerror_r(errno, strerr_buf, MAX_STRERROR_LEN));
     if (setreuid (target_uid, target_uid))
-        WARN ("setreuid() failed: %s", strerror(errno));
+        WARN ("setreuid() failed: %s", strerror_r(errno, strerr_buf, MAX_STRERROR_LEN));
 
     int grouplist_len = NGROUPS_MAX;
     gid_t grouplist[NGROUPS_MAX];
@@ -684,7 +702,7 @@ _exec_user_session (
     if (home) {
         DBG ("changing directory to : %s", home);
         if (chdir (home) < 0)
-            WARN ("Failed to change directroy : %s", strerror (errno));
+            WARN ("Failed to change directroy : %s", strerror_r(errno, strerr_buf, MAX_STRERROR_LEN));
     } else WARN ("Could not get home directory");
 
     shell = tlm_config_get_string (priv->config,
@@ -712,7 +730,7 @@ _exec_user_session (
     }
 
     if (signal (SIGINT, SIG_DFL) == SIG_ERR)
-        WARN ("failed reset SIGINT: %s", strerror(errno));
+        WARN ("failed reset SIGINT: %s", strerror_r(errno, strerr_buf, MAX_STRERROR_LEN));
 
     DBG ("executing: ");
     args_iter = args;
@@ -723,7 +741,7 @@ _exec_user_session (
     execvp (args[0], args);
     /* we reach here only in case of error */
     g_strfreev (args);
-    DBG ("execl(): %s", strerror(errno));
+    DBG ("execl(): %s", strerror_r(errno, strerr_buf, MAX_STRERROR_LEN));
     exit (0);
 }
 
@@ -858,6 +876,7 @@ _terminate_timeout (gpointer user_data)
 {
     TlmSession *session = TLM_SESSION(user_data);
     TlmSessionPrivate *priv = TLM_SESSION_PRIV(session);
+    gchar strerr_buf[MAX_STRERROR_LEN] = {0,};
 
     switch (priv->last_sig)
     {
@@ -867,7 +886,7 @@ _terminate_timeout (gpointer user_data)
             if (killpg (getpgid (priv->child_pid), SIGTERM))
                 WARN ("killpg(%u, SIGTERM): %s",
                       getpgid (priv->child_pid),
-                      strerror(errno));
+                      strerror_r(errno, strerr_buf, MAX_STRERROR_LEN));
             priv->last_sig = SIGTERM;
             return G_SOURCE_CONTINUE;
         case SIGTERM:
@@ -876,7 +895,7 @@ _terminate_timeout (gpointer user_data)
             if (killpg (getpgid (priv->child_pid), SIGKILL))
                 WARN ("killpg(%u, SIGKILL): %s",
                       getpgid (priv->child_pid),
-                      strerror(errno));
+                      strerror_r(errno, strerr_buf, MAX_STRERROR_LEN));
             priv->last_sig = SIGKILL;
             return G_SOURCE_CONTINUE;
         case SIGKILL:
@@ -918,9 +937,12 @@ tlm_session_terminate (TlmSession *session)
     }
 
     if (killpg (getpgid (priv->child_pid), SIGHUP) < 0)
+    {
+        gchar strerr_buf[MAX_STRERROR_LEN] = {0,};
         WARN ("kill(%u, SIGHUP): %s",
               getpgid (priv->child_pid),
-              strerror(errno));
+              strerror_r(errno, strerr_buf, MAX_STRERROR_LEN));
+    }
     priv->last_sig = SIGHUP;
     priv->timer_id = g_timeout_add_seconds (
             tlm_config_get_uint (priv->config, TLM_CONFIG_GENERAL,
old mode 100644 (file)
new mode 100755 (executable)
index a27295f..c13004a
@@ -140,6 +140,7 @@ static void _tlm_launcher_process (TlmLauncher *l)
   char str[1024];
   gchar **argv = NULL;
   pid_t child_pid = 0;
+  gchar strerr_buf[MAX_STRERROR_LEN] = {0,};
 
   if (!l || !l->fp) return;
 
@@ -161,13 +162,13 @@ static void _tlm_launcher_process (TlmLauncher *l)
         if (!argv)
           ERR("Getting argv failure");
         if ((child_pid = fork()) < 0) {
-          ERR("fork() failed: %s", strerror (errno));
+            ERR("fork() failed: %s", strerror_r(errno, strerr_buf, MAX_STRERROR_LEN));
         } else if (child_pid == 0) {
             /* child process */
             INFO("Launching command : %s, pid: %d, ppid: %d\n",
                 argv[0], getpid (), getppid ());
             execvp(argv[0], argv);
-            WARN("exec failed: %s", strerror (errno));
+            WARN("exec failed: %s", strerror_r(errno, strerr_buf, MAX_STRERROR_LEN));
         } else if (control == 'M') {
           ChildInfo *info = g_slice_new0 (ChildInfo);
           if (!info) {
@@ -237,7 +238,8 @@ int main (int argc, char *argv[])
   _tlm_launcher_init (&launcher);
 
   if (!(launcher.fp = fopen(file, "r"))) {
-    ERR("Failed to open file '%s':%s", file, strerror(errno));
+    gchar strerr_buf[MAX_STRERROR_LEN] = {0,};
+    ERR("Failed to open file '%s':%s", file, strerror_r(errno, strerr_buf, MAX_STRERROR_LEN));
     _tlm_launcher_deinit (&launcher);
     return 0;
   }