The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/lxcfs/pull/331

This e-mail was sent by the LXC bot, direct replies will not reach the author
unless they happen to be subscribed to this list.

=== Description (from pull-request) ===
Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
From c55c8774a11bd53eb424aba44b2c157188531398 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Thu, 27 Feb 2020 12:10:57 +0100
Subject: [PATCH 1/4] croups: remove unused variable

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 cgroups/cgroup_utils.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/cgroups/cgroup_utils.c b/cgroups/cgroup_utils.c
index 936a156..9e63578 100644
--- a/cgroups/cgroup_utils.c
+++ b/cgroups/cgroup_utils.c
@@ -469,7 +469,6 @@ FILE *fopen_cloexec(const char *path, const char *mode)
        __do_fclose FILE *ret = NULL;
        int open_mode = 0;
        int step = 0;
-       int saved_errno = 0;
 
        if (!strncmp(mode, "r+", 2)) {
                open_mode = O_RDWR;

From 99b183fb2ff4ed2181f84e6436cec4dfa22b5be0 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Thu, 27 Feb 2020 12:21:43 +0100
Subject: [PATCH 2/4] tree-wide: introduce casting helpers

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 bindings.h     |  4 ++--
 cgroup_fuse.c  | 10 +++++-----
 macro.h        |  3 +++
 proc_cpuview.c |  2 +-
 proc_fuse.c    | 20 ++++++++++----------
 proc_loadavg.c |  2 +-
 sysfs_fuse.c   |  6 +++---
 utils.c        |  3 ++-
 8 files changed, 27 insertions(+), 23 deletions(-)

diff --git a/bindings.h b/bindings.h
index 777fcd2..d995518 100644
--- a/bindings.h
+++ b/bindings.h
@@ -57,9 +57,9 @@ struct file_info {
        char *cgroup;
        char *file;
        int type;
-       char *buf;  // unused as of yet
+       char *buf; /* unused */
        int buflen;
-       int size; //actual data size
+       int size; /*actual data size */
        int cached;
 };
 
diff --git a/cgroup_fuse.c b/cgroup_fuse.c
index 9f9325f..2ff2ea6 100644
--- a/cgroup_fuse.c
+++ b/cgroup_fuse.c
@@ -1150,7 +1150,7 @@ int cg_open(const char *path, struct fuse_file_info *fi)
        file_info->buf = NULL;
        file_info->buflen = 0;
 
-       fi->fh = (unsigned long)file_info;
+       fi->fh = PTR_TO_UINT64(file_info);
        ret = 0;
 
 out:
@@ -1358,7 +1358,7 @@ int cg_read(const char *path, char *buf, size_t size, 
off_t offset,
            struct fuse_file_info *fi)
 {
        struct fuse_context *fc = fuse_get_context();
-       struct file_info *f = (struct file_info *)fi->fh;
+       struct file_info *f = INTTYPE_TO_PTR(fi->fh);
        struct cgfs_files *k = NULL;
        char *data = NULL;
        int ret, s;
@@ -1468,7 +1468,7 @@ int cg_opendir(const char *path, struct fuse_file_info 
*fi)
        dir_info->file = NULL;
        dir_info->buflen = 0;
 
-       fi->fh = (unsigned long)dir_info;
+       fi->fh = PTR_TO_UINT64(dir_info);
        return 0;
 }
 
@@ -1811,7 +1811,7 @@ int cg_write(const char *path, const char *buf, size_t 
size, off_t offset,
        struct fuse_context *fc = fuse_get_context();
        char *localbuf = NULL;
        struct cgfs_files *k = NULL;
-       struct file_info *f = (struct file_info *)fi->fh;
+       struct file_info *f = INTTYPE_TO_PTR(fi->fh);
        bool r;
 
        if (!fc || !cgroup_ops || pure_unified_layout(cgroup_ops))
@@ -1977,7 +1977,7 @@ static void free_keys(struct cgfs_files **keys)
 int cg_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
               off_t offset, struct fuse_file_info *fi)
 {
-       struct file_info *d = (struct file_info *)fi->fh;
+       struct file_info *d = INTTYPE_TO_PTR(fi->fh);
        struct cgfs_files **list = NULL;
        int i, ret;
        char *nextcg = NULL;
diff --git a/macro.h b/macro.h
index dd66f24..b4277cb 100644
--- a/macro.h
+++ b/macro.h
@@ -95,4 +95,7 @@
                _exit(EXIT_FAILURE);                    \
        })
 
+#define PTR_TO_UINT64(p) ((uint64_t)((intptr_t)(p)))
+#define INTTYPE_TO_PTR(u) ((void *)((intptr_t)(u)))
+
 #endif /* __LXCFS_MACRO_H */
diff --git a/proc_cpuview.c b/proc_cpuview.c
index e31d457..330438a 100644
--- a/proc_cpuview.c
+++ b/proc_cpuview.c
@@ -881,7 +881,7 @@ int proc_cpuinfo_read(char *buf, size_t size, off_t offset,
        __do_free char *cg = NULL, *cpuset = NULL, *line = NULL;
        __do_fclose FILE *f = NULL;
        struct fuse_context *fc = fuse_get_context();
-       struct file_info *d = (struct file_info *)fi->fh;
+       struct file_info *d = INTTYPE_TO_PTR(fi->fh);
        size_t linelen = 0, total_len = 0;
        bool am_printing = false, firstline = true, is_s390x = false;
        int curcpu = -1, cpu, max_cpus = 0;
diff --git a/proc_fuse.c b/proc_fuse.c
index 7717c66..0117fee 100644
--- a/proc_fuse.c
+++ b/proc_fuse.c
@@ -153,7 +153,7 @@ int proc_open(const char *path, struct fuse_file_info *fi)
        /* set actual size to buffer size */
        info->size = info->buflen;
 
-       fi->fh = (unsigned long)info;
+       fi->fh = PTR_TO_UINT64(info);
        return 0;
 }
 
@@ -224,7 +224,7 @@ static int proc_swaps_read(char *buf, size_t size, off_t 
offset,
        __do_free char *cg = NULL, *memswlimit_str = NULL, *memusage_str = NULL,
                       *memswusage_str = NULL;
        struct fuse_context *fc = fuse_get_context();
-       struct file_info *d = (struct file_info *)fi->fh;
+       struct file_info *d = INTTYPE_TO_PTR(fi->fh);
        unsigned long memswlimit = 0, memlimit = 0, memusage = 0,
                      memswusage = 0, swap_total = 0, swap_free = 0;
        ssize_t total_len = 0;
@@ -347,7 +347,7 @@ static int proc_diskstats_read(char *buf, size_t size, 
off_t offset,
                       *line = NULL;
        __do_fclose FILE *f = NULL;
        struct fuse_context *fc = fuse_get_context();
-       struct file_info *d = (struct file_info *)fi->fh;
+       struct file_info *d = INTTYPE_TO_PTR(fi->fh);
        unsigned long read = 0, write = 0;
        unsigned long read_merged = 0, write_merged = 0;
        unsigned long read_sectors = 0, write_sectors = 0;
@@ -655,7 +655,7 @@ static int proc_uptime_read(char *buf, size_t size, off_t 
offset,
                            struct fuse_file_info *fi)
 {
        struct fuse_context *fc = fuse_get_context();
-       struct file_info *d = (struct file_info *)fi->fh;
+       struct file_info *d = INTTYPE_TO_PTR(fi->fh);
        double busytime = get_reaper_busy(fc->pid);
        char *cache = d->buf;
        ssize_t total_len = 0;
@@ -707,7 +707,7 @@ static int proc_stat_read(char *buf, size_t size, off_t 
offset,
        __do_free struct cpuacct_usage *cg_cpu_usage = NULL;
        __do_fclose FILE *f = NULL;
        struct fuse_context *fc = fuse_get_context();
-       struct file_info *d = (struct file_info *)fi->fh;
+       struct file_info *d = INTTYPE_TO_PTR(fi->fh);
        size_t linelen = 0, total_len = 0;
        int curcpu = -1; /* cpu numbering starts at 0 */
        int physcpu = 0;
@@ -1004,7 +1004,7 @@ static int proc_meminfo_read(char *buf, size_t size, 
off_t offset,
        __do_fclose FILE *f = NULL;
        struct fuse_context *fc = fuse_get_context();
        struct lxcfs_opts *opts = (struct lxcfs_opts *) 
fuse_get_context()->private_data;
-       struct file_info *d = (struct file_info *)fi->fh;
+       struct file_info *d = INTTYPE_TO_PTR(fi->fh);
        unsigned long memlimit = 0, memusage = 0, memswlimit = 0,
                      memswusage = 0, cached = 0, hosttotal = 0, active_anon = 
0,
                      inactive_anon = 0, active_file = 0, inactive_file = 0,
@@ -1193,9 +1193,9 @@ static int proc_meminfo_read(char *buf, size_t size, 
off_t offset,
 }
 
 int proc_read(const char *path, char *buf, size_t size, off_t offset,
-               struct fuse_file_info *fi)
+             struct fuse_file_info *fi)
 {
-       struct file_info *f = (struct file_info *) fi->fh;
+       struct file_info *f = INTTYPE_TO_PTR(fi->fh);
 
        switch (f->type) {
        case LXC_TYPE_PROC_MEMINFO:
@@ -1212,7 +1212,7 @@ int proc_read(const char *path, char *buf, size_t size, 
off_t offset,
                return proc_swaps_read(buf, size, offset, fi);
        case LXC_TYPE_PROC_LOADAVG:
                return proc_loadavg_read(buf, size, offset, fi);
-       default:
-               return -EINVAL;
        }
+
+       return -EINVAL;
 }
diff --git a/proc_loadavg.c b/proc_loadavg.c
index 3947f31..9fc602b 100644
--- a/proc_loadavg.c
+++ b/proc_loadavg.c
@@ -163,7 +163,7 @@ int proc_loadavg_read(char *buf, size_t size, off_t offset,
                      struct fuse_file_info *fi)
 {
        struct fuse_context *fc = fuse_get_context();
-       struct file_info *d = (struct file_info *)fi->fh;
+       struct file_info *d = INTTYPE_TO_PTR(fi->fh);
        pid_t initpid;
        char *cg;
        size_t total_len = 0;
diff --git a/sysfs_fuse.c b/sysfs_fuse.c
index 9ac6639..599790d 100644
--- a/sysfs_fuse.c
+++ b/sysfs_fuse.c
@@ -49,7 +49,7 @@ static int sys_devices_system_cpu_online_read(char *buf, 
size_t size,
                                              struct fuse_file_info *fi)
 {
        struct fuse_context *fc = fuse_get_context();
-       struct file_info *d = (struct file_info *)fi->fh;
+       struct file_info *d = INTTYPE_TO_PTR(fi->fh);
        char *cache = d->buf;
        char *cg;
        char *cpuset = NULL;
@@ -234,7 +234,7 @@ int sys_open(const char *path, struct fuse_file_info *fi)
        /* set actual size to buffer size */
        info->size = info->buflen;
 
-       fi->fh = (unsigned long)info;
+       fi->fh = PTR_TO_UINT64(info);
        return 0;
 }
 
@@ -270,7 +270,7 @@ int sys_releasedir(const char *path, struct fuse_file_info 
*fi)
 int sys_read(const char *path, char *buf, size_t size, off_t offset,
             struct fuse_file_info *fi)
 {
-       struct file_info *f = (struct file_info *)fi->fh;
+       struct file_info *f = INTTYPE_TO_PTR(fi->fh);
 
        switch (f->type) {
        case LXC_TYPE_SYS_DEVICES_SYSTEM_CPU_ONLINE:
diff --git a/utils.c b/utils.c
index 6422b09..50c940f 100644
--- a/utils.c
+++ b/utils.c
@@ -157,8 +157,9 @@ int preserve_ns(const int pid, const char *ns)
 
 void do_release_file_info(struct fuse_file_info *fi)
 {
-       struct file_info *f = (struct file_info *)fi->fh;
+       struct file_info *f;
 
+       f = INTTYPE_TO_PTR(fi->fh);
        if (!f)
                return;
 

From 2b8eff1d5dd755c07208e5aa1fab82bf65ffe78d Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Thu, 27 Feb 2020 12:26:12 +0100
Subject: [PATCH 3/4] proc_fuse: use correct format specifier

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 bindings.c     |  6 ++---
 proc_cpuview.c | 59 +++++++++++++++++++++++++-------------------------
 proc_fuse.c    | 20 ++++++++---------
 3 files changed, 40 insertions(+), 45 deletions(-)

diff --git a/bindings.c b/bindings.c
index d365ce6..e4a8d15 100644
--- a/bindings.c
+++ b/bindings.c
@@ -692,10 +692,8 @@ static bool cgfs_setup_controllers(void)
        if (!cgfs_prepare_mounts())
                return false;
 
-       if (!cgfs_mount_hierarchies()) {
-               lxcfs_error("%s\n", "Failed to set up private lxcfs cgroup 
mounts.");
-               return false;
-       }
+       if (!cgfs_mount_hierarchies())
+               return log_error_errno(false, errno, "Failed to set up private 
lxcfs cgroup mounts");
 
        if (!permute_root())
                return false;
diff --git a/proc_cpuview.c b/proc_cpuview.c
index 330438a..5d29a5c 100644
--- a/proc_cpuview.c
+++ b/proc_cpuview.c
@@ -372,8 +372,8 @@ static struct cg_proc_stat 
*find_or_create_proc_stat_node(struct cpuacct_usage *
        return node;
 }
 
-static void add_cpu_usage(unsigned long *surplus, struct cpuacct_usage *usage,
-                         unsigned long *counter, unsigned long threshold)
+static void add_cpu_usage(uint64_t *surplus, struct cpuacct_usage *usage,
+                         uint64_t *counter, uint64_t threshold)
 {
        unsigned long free_space, to_add;
 
@@ -441,7 +441,7 @@ static bool read_cpu_cfs_param(const char *cg, const char 
*param, int64_t *value
        if (!cgroup_ops->get(cgroup_ops, "cpu", cg, file, &str))
                return false;
 
-       if (sscanf(str, "%ld", value) != 1)
+       if (sscanf(str, "%"PRId64, value) != 1)
                return false;
 
        return true;
@@ -534,11 +534,11 @@ int cpuview_proc_stat(const char *cg, const char *cpuset,
        int curcpu = -1; /* cpu numbering starts at 0 */
        int physcpu, i;
        int max_cpus = max_cpu_count(cg), cpu_cnt = 0;
-       unsigned long user = 0, nice = 0, system = 0, idle = 0, iowait = 0,
-                     irq = 0, softirq = 0, steal = 0, guest = 0, guest_nice = 
0;
-       unsigned long user_sum = 0, system_sum = 0, idle_sum = 0;
-       unsigned long user_surplus = 0, system_surplus = 0;
-       unsigned long total_sum, threshold;
+       uint64_t user = 0, nice = 0, system = 0, idle = 0, iowait = 0, irq = 0,
+                softirq = 0, steal = 0, guest = 0, guest_nice = 0;
+       uint64_t user_sum = 0, system_sum = 0, idle_sum = 0;
+       uint64_t user_surplus = 0, system_surplus = 0;
+       uint64_t total_sum, threshold;
        struct cg_proc_stat *stat_node;
        int nprocs = get_nprocs_conf();
 
@@ -583,7 +583,7 @@ int cpuview_proc_stat(const char *cg, const char *cpuset,
 
                cg_cpu_usage[curcpu].online = true;
 
-               ret = sscanf(line, "%*s %lu %lu %lu %lu %lu %lu %lu %lu %lu 
%lu",
+               ret = sscanf(line, "%*s %" PRIu64 " %" PRIu64 " %" PRIu64 " %" 
PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 
"lu",
                           &user,
                           &nice,
                           &system,
@@ -605,9 +605,8 @@ int cpuview_proc_stat(const char *cg, const char *cpuset,
                        cg_cpu_usage[curcpu].idle = idle + (all_used - cg_used);
 
                } else {
-                       lxcfs_error("cpu%d from %s has unexpected cpu time: %lu 
in /proc/stat, "
-                                       "%lu in cpuacct.usage_all; unable to 
determine idle time\n",
-                                       curcpu, cg, all_used, cg_used);
+                       lxcfs_error("cpu%d from %s has unexpected cpu time: %" 
PRIu64 " in /proc/stat, %" PRIu64 " in cpuacct.usage_all; unable to determine 
idle time",
+                                   curcpu, cg, all_used, cg_used);
                        cg_cpu_usage[curcpu].idle = idle;
                }
        }
@@ -664,11 +663,11 @@ int cpuview_proc_stat(const char *cg, const char *cpuset,
 
        /* Calculate usage counters of visible CPUs */
        if (max_cpus > 0) {
-               unsigned long diff_user = 0;
-               unsigned long diff_system = 0;
-               unsigned long diff_idle = 0;
-               unsigned long max_diff_idle = 0;
-               unsigned long max_diff_idle_index = 0;
+               uint64_t diff_user = 0;
+               uint64_t diff_system = 0;
+               uint64_t diff_idle = 0;
+               uint64_t max_diff_idle = 0;
+               uint64_t max_diff_idle_index = 0;
                double exact_cpus;
 
                /* threshold = maximum usage per cpu, including idle */
@@ -765,10 +764,9 @@ int cpuview_proc_stat(const char *cg, const char *cpuset,
 
        /* Render the file */
        /* cpu-all */
-       l = snprintf(buf, buf_size, "cpu  %lu 0 %lu %lu 0 0 0 0 0 0\n",
-                       user_sum,
-                       system_sum,
-                       idle_sum);
+       l = snprintf(buf, buf_size,
+                    "cpu  %" PRIu64 " 0 %" PRIu64 " %" PRIu64 " 0 0 0 0 0 0\n",
+                    user_sum, system_sum, idle_sum);
        lxcfs_v("cpu-all: %s\n", buf);
 
        if (l < 0) {
@@ -794,11 +792,11 @@ int cpuview_proc_stat(const char *cg, const char *cpuset,
                if (max_cpus > 0 && i == max_cpus)
                        break;
 
-               l = snprintf(buf, buf_size, "cpu%d %lu 0 %lu %lu 0 0 0 0 0 0\n",
-                               i,
-                               stat_node->view[curcpu].user,
-                               stat_node->view[curcpu].system,
-                               stat_node->view[curcpu].idle);
+               l = snprintf(buf, buf_size, "cpu%d %" PRIu64 " 0 %" PRIu64 " %" 
PRIu64 " 0 0 0 0 0 0\n",
+                            i,
+                            stat_node->view[curcpu].user,
+                            stat_node->view[curcpu].system,
+                            stat_node->view[curcpu].idle);
                lxcfs_v("cpu: %s\n", buf);
 
                if (l < 0) {
@@ -1088,8 +1086,8 @@ int read_cpuacct_usage_all(char *cg, char *cpuset,
 
                must_strcat(&data, &sz, &asz, "cpu user system\n");
 
-               while (sscanf(usage_str + read_pos, "%lu %n", &cg_user, 
&read_cnt) > 0) {
-                       lxcfs_debug("i: %d, cg_user: %lu, read_pos: %d, 
read_cnt: %d\n", i, cg_user, read_pos, read_cnt);
+               while (sscanf(usage_str + read_pos, "%" PRIu64 " %n", &cg_user, 
&read_cnt) > 0) {
+                       lxcfs_debug("i: %d, cg_user: %" PRIu64 ", read_pos: %d, 
read_cnt: %d\n", i, cg_user, read_pos, read_cnt);
                        must_strcat(&data, &sz, &asz, "%d %lu 0\n", i, cg_user);
                        i++;
                        read_pos += read_cnt;
@@ -1109,8 +1107,9 @@ int read_cpuacct_usage_all(char *cg, char *cpuset,
        read_pos += read_cnt;
 
        for (i = 0, j = 0; i < cpucount; i++) {
-               ret = sscanf(usage_str + read_pos, "%d %lu %lu\n%n", &cg_cpu, 
&cg_user,
-                               &cg_system, &read_cnt);
+               ret = sscanf(usage_str + read_pos,
+                            "%d %" PRIu64 " %" PRIu64 "\n%n", &cg_cpu,
+                            &cg_user, &cg_system, &read_cnt);
 
                if (ret == EOF)
                        break;
diff --git a/proc_fuse.c b/proc_fuse.c
index 0117fee..037fa32 100644
--- a/proc_fuse.c
+++ b/proc_fuse.c
@@ -762,10 +762,8 @@ static int proc_stat_read(char *buf, size_t size, off_t 
offset,
         * If the cpuacct cgroup is present, it is used to calculate the 
container's
         * CPU usage. If not, values from the host's /proc/stat are used.
         */
-       if (read_cpuacct_usage_all(cg, cpuset, &cg_cpu_usage, 
&cg_cpu_usage_size) != 0) {
-               lxcfs_v("%s\n", "proc_stat_read failed to read from cpuacct, "
-                               "falling back to the host's /proc/stat");
-       }
+       if (read_cpuacct_usage_all(cg, cpuset, &cg_cpu_usage, 
&cg_cpu_usage_size) != 0)
+               lxcfs_v("%s\n", "proc_stat_read failed to read from cpuacct, 
falling back to the host's /proc/stat");
 
        f = fopen("/proc/stat", "r");
        if (!f)
@@ -813,7 +811,7 @@ static int proc_stat_read(char *buf, size_t size, off_t 
offset,
                        continue;
                if (!cpu_in_cpuset(physcpu, cpuset))
                        continue;
-               curcpu ++;
+               curcpu++;
 
                ret = sscanf(line, "%*s %lu %lu %lu %lu %lu %lu %lu %lu %lu 
%lu",
                           &user,
@@ -861,15 +859,15 @@ static int proc_stat_read(char *buf, size_t size, off_t 
offset,
                                new_idle = idle + (all_used - cg_used);
 
                        } else {
-                               lxcfs_error("cpu%d from %s has unexpected cpu 
time: %lu in /proc/stat, "
-                                               "%lu in cpuacct.usage_all; 
unable to determine idle time\n",
-                                               curcpu, cg, all_used, cg_used);
+                               lxcfs_error("cpu%d from %s has unexpected cpu 
time: %" PRIu64 " in /proc/stat, %" PRIu64 " in cpuacct.usage_all; unable to 
determine idle time",
+                                           curcpu, cg, all_used, cg_used);
                                new_idle = idle;
                        }
 
-                       l = snprintf(cache, cache_size, "cpu%d %lu 0 %lu %lu 0 
0 0 0 0 0\n",
-                                       curcpu, cg_cpu_usage[physcpu].user, 
cg_cpu_usage[physcpu].system,
-                                       new_idle);
+                       l = snprintf(cache, cache_size,
+                                    "cpu%d %" PRIu64 " 0 %" PRIu64 " %" PRIu64 
" 0 0 0 0 0 0\n",
+                                    curcpu, cg_cpu_usage[physcpu].user,
+                                    cg_cpu_usage[physcpu].system, new_idle);
 
                        if (l < 0) {
                                perror("Error writing to cache");

From 1aa8983063cba544ece03a25eec987407743707c Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Thu, 27 Feb 2020 13:07:05 +0100
Subject: [PATCH 4/4] cgroup_utils: fix mounting

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 cgroups/cgroup_utils.c | 15 +++++++--------
 1 file changed, 7 insertions(+), 8 deletions(-)

diff --git a/cgroups/cgroup_utils.c b/cgroups/cgroup_utils.c
index 9e63578..896ed43 100644
--- a/cgroups/cgroup_utils.c
+++ b/cgroups/cgroup_utils.c
@@ -291,12 +291,12 @@ static int open_if_safe(int dirfd, const char *nextpath)
 {
        __do_close_prot_errno int newfd = -EBADF;
 
-       newfd = openat(dirfd, nextpath, O_RDONLY | O_NOFOLLOW | O_CLOEXEC);
+       newfd = openat(dirfd, nextpath, O_RDONLY | O_CLOEXEC);
        if (newfd >= 0) /* Was not a symlink, all good. */
-               return newfd;
+               return move_fd(newfd);
 
        if (errno == ELOOP)
-               return newfd;
+               return move_fd(newfd);
 
        if (errno == EPERM || errno == EACCES) {
                /* We're not root (cause we got EPERM) so try opening with
@@ -310,7 +310,7 @@ static int open_if_safe(int dirfd, const char *nextpath)
                         */
                        int ret = check_symlink(newfd);
                        if (ret < 0)
-                               newfd = ret;
+                               return -1;
                }
        }
 
@@ -371,7 +371,7 @@ static int open_without_symlink(const char *target, const 
char *prefix_skip)
                return -1;
 
        for (;;) {
-               __do_close_prot_errno int newfd = -EBADF;
+               int newfd;
                char *nextpath;
 
                nextpath = get_nextpath(dup, &curlen, fulllen);
@@ -379,11 +379,10 @@ static int open_without_symlink(const char *target, const 
char *prefix_skip)
                        return move_fd(dirfd);
 
                newfd = open_if_safe(dirfd, nextpath);
-               if (newfd < 0)
-                       return -1;
-
                close_prot_errno_disarm(dirfd);
                dirfd = newfd;
+               if (newfd < 0)
+                       return -1;
        }
 
        return move_fd(dirfd);
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to