Fix: Missing umask when using run as no clone
[lttng-tools.git] / src / common / runas.c
index 7de566ddb9fce211bb0db34d3c95c24a7cf6b3af..5bd43e65b7c072b5ea40e1f6e16807f594986fe4 100644 (file)
@@ -153,13 +153,14 @@ int _open(void *_data)
 static
 int child_run_as(void *_data)
 {
+       int ret;
        struct run_as_data *data = _data;
-       size_t writelen, writeleft, index;
+       ssize_t writelen;
+       size_t writeleft, index;
        union {
                int i;
                char c[sizeof(int)];
        } sendret;
-       int ret;
 
        /*
         * Child: it is safe to drop egid and euid while sharing the
@@ -191,8 +192,10 @@ int child_run_as(void *_data)
        writeleft = sizeof(sendret);
        index = 0;
        do {
-               writelen = write(data->retval_pipe, &sendret.c[index],
-                               writeleft);
+               do {
+                       writelen = write(data->retval_pipe, &sendret.c[index],
+                                       writeleft);
+               } while (writelen < 0 && errno == EINTR);
                if (writelen < 0) {
                        PERROR("write");
                        return EXIT_FAILURE;
@@ -310,21 +313,34 @@ end:
 static
 int run_as_noclone(int (*cmd)(void *data), void *data, uid_t uid, gid_t gid)
 {
-       return cmd(data);
+       int ret;
+       mode_t old_mask;
+
+       old_mask = umask(0);
+       ret = cmd(data);
+       umask(old_mask);
+
+       return ret;
 }
 
 static
 int run_as(int (*cmd)(void *data), void *data, uid_t uid, gid_t gid)
 {
        if (!getenv("LTTNG_DEBUG_NOCLONE")) {
+               int ret;
+
                DBG("Using run_as_clone");
-               return run_as_clone(cmd, data, uid, gid);
+               pthread_mutex_lock(&lttng_libc_state_lock);
+               ret = run_as_clone(cmd, data, uid, gid);
+               pthread_mutex_unlock(&lttng_libc_state_lock);
+               return ret;
        } else {
                DBG("Using run_as_noclone");
                return run_as_noclone(cmd, data, uid, gid);
        }
 }
 
+__attribute__((visibility("hidden")))
 int run_as_mkdir_recursive(const char *path, mode_t mode, uid_t uid, gid_t gid)
 {
        struct run_as_mkdir_data data;
@@ -336,6 +352,7 @@ int run_as_mkdir_recursive(const char *path, mode_t mode, uid_t uid, gid_t gid)
        return run_as(_mkdir_recursive, &data, uid, gid);
 }
 
+__attribute__((visibility("hidden")))
 int run_as_mkdir(const char *path, mode_t mode, uid_t uid, gid_t gid)
 {
        struct run_as_mkdir_data data;
@@ -351,6 +368,7 @@ int run_as_mkdir(const char *path, mode_t mode, uid_t uid, gid_t gid)
  * Note: open_run_as is currently not working. We'd need to pass the fd
  * opened in the child to the parent.
  */
+__attribute__((visibility("hidden")))
 int run_as_open(const char *path, int flags, mode_t mode, uid_t uid, gid_t gid)
 {
        struct run_as_open_data data;
This page took 0.02417 seconds and 4 git commands to generate.