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

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 8d49f03bc6bdf01d16f90f55ebcc3eb316e6ad94 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Thu, 27 Feb 2020 20:38:22 +0100
Subject: [PATCH 1/3] cgroup_utils: re-add O_NOFOLLOW

This got removed on accident.

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

diff --git a/cgroups/cgroup_utils.c b/cgroups/cgroup_utils.c
index 896ed43..805ee32 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_CLOEXEC);
+       newfd = openat(dirfd, nextpath, O_RDONLY | O_CLOEXEC | O_NOFOLLOW);
        if (newfd >= 0) /* Was not a symlink, all good. */
                return move_fd(newfd);
 
        if (errno == ELOOP)
-               return move_fd(newfd);
+               return -1;
 
        if (errno == EPERM || errno == EACCES) {
                /* We're not root (cause we got EPERM) so try opening with

From 7eac38257f55d4ad92ebef350b4333879e28bfa4 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Thu, 27 Feb 2020 21:48:39 +0100
Subject: [PATCH 2/3] autotools: add support for ASAN and UBSAN

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 Makefile.am  | 20 ++++++++++++++++++++
 configure.ac | 25 +++++++++++++++++++++++++
 2 files changed, 45 insertions(+)

diff --git a/Makefile.am b/Makefile.am
index 5029ef3..e6dc703 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -28,6 +28,16 @@ liblxcfs_la_SOURCES = api_extension.h \
                      sysfs_fuse.c sysfs_fuse.h \
                      utils.c utils.h
 liblxcfs_la_CFLAGS = $(AM_CFLAGS)
+
+if ENABLE_ASAN
+liblxcfs_la_CFLAGS += -fsanitize=address \
+                     -fno-omit-frame-pointer
+endif
+
+if ENABLE_UBSAN
+liblxcfs_la_CFLAGS += -fsanitize=undefined
+endif
+
 liblxcfs_la_LDFLAGS = $(AM_CFLAGS) -module -avoid-version -shared
 
 liblxcfstest_la_SOURCES = api_extension.h \
@@ -46,6 +56,16 @@ liblxcfstest_la_SOURCES = api_extension.h \
                          sysfs_fuse.c sysfs_fuse.h \
                          utils.c utils.h
 liblxcfstest_la_CFLAGS = $(AM_CFLAGS) -DRELOADTEST
+
+if ENABLE_ASAN
+liblxcfstest_la_CFLAGS += -fsanitize=address \
+                         -fno-omit-frame-pointer
+endif
+
+if ENABLE_UBSAN
+liblxcfstest_la_CFLAGS += -fsanitize=undefined
+endif
+
 liblxcfstest_la_LDFLAGS = $(AM_CFLAGS) -module -avoid-version -shared
 
 noinst_HEADERS = bindings.h \
diff --git a/configure.ac b/configure.ac
index ad2b0b8..dbe26e7 100644
--- a/configure.ac
+++ b/configure.ac
@@ -230,4 +230,29 @@ AX_CHECK_COMPILE_FLAG([-fexceptions], [CFLAGS="$CFLAGS 
-fexceptions"],,[-Werror]
 AX_CHECK_LINK_FLAG([-z relro], [LDFLAGS="$LDFLAGS -z relro"],,[])
 AX_CHECK_LINK_FLAG([-z now], [LDFLAGS="$LDFLAGS -z now"],,[])
 
+# Build with ASAN commands
+AC_ARG_ENABLE([asan],
+       [AS_HELP_STRING([--enable-asan], [build with address sanitizer enabled 
[default=no]])],
+       [enable_asan=$enableval], [enable_asan=no])
+AM_CONDITIONAL([ENABLE_ASAN], [test "x$enable_asan" = "xyes"])
+
+# Build with UBSAN commands
+AC_ARG_ENABLE([ubsan],
+       [AS_HELP_STRING([--enable-ubsan], [build with ubsan sanitizer enabled 
[default=no]])],
+       [enable_asan=$enableval], [enable_ubsan=no])
+AM_CONDITIONAL([ENABLE_UBSAN], [test "x$enable_ubsan" = "xyes"])
+
 AC_OUTPUT
+
+# Configuration overview
+cat << EOF
+
+----------------------------
+Environment:
+ - compiler: $CC
+
+Debugging:
+ - tests: $enable_tests
+ - ASAN: $enable_asan
+ - mutex debugging: $enable_mutex_debugging
+EOF

From 700dd417de46bf96d9abe7b4beb506ecc8af61db Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Thu, 27 Feb 2020 22:23:45 +0100
Subject: [PATCH 3/3] tree-wide: fix memory leaks

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 proc_cpuview.c |  6 ++----
 proc_fuse.c    |  4 ++--
 sysfs_fuse.c   | 44 +++++++++++++++++++++++++-------------------
 utils.c        |  2 +-
 4 files changed, 30 insertions(+), 26 deletions(-)

diff --git a/proc_cpuview.c b/proc_cpuview.c
index 5d29a5c..9551987 100644
--- a/proc_cpuview.c
+++ b/proc_cpuview.c
@@ -482,10 +482,10 @@ static double exact_cpu_count(const char *cg)
  */
 int max_cpu_count(const char *cg)
 {
+       __do_free char *cpuset = NULL;
        int rv, nprocs;
        int64_t cfs_quota, cfs_period;
        int nr_cpus_in_cpuset = 0;
-       char *cpuset = NULL;
 
        if (!read_cpu_cfs_param(cg, "quota", &cfs_quota))
                return 0;
@@ -616,16 +616,14 @@ int cpuview_proc_stat(const char *cg, const char *cpuset,
                max_cpus = cpu_cnt;
 
        stat_node = find_or_create_proc_stat_node(cg_cpu_usage, nprocs, cg);
-
        if (!stat_node) {
                lxcfs_error("unable to find/create stat node for %s\n", cg);
                return 0;
        }
 
        diff = malloc(sizeof(struct cpuacct_usage) * nprocs);
-       if (!diff) {
+       if (!diff)
                return 0;
-       }
 
        /*
         * If the new values are LOWER than values stored in memory, it means
diff --git a/proc_fuse.c b/proc_fuse.c
index 6a14e90..afe11a2 100644
--- a/proc_fuse.c
+++ b/proc_fuse.c
@@ -138,8 +138,8 @@ static off_t get_procfile_size(const char *which)
 
 int proc_open(const char *path, struct fuse_file_info *fi)
 {
+       __do_free struct file_info *info = NULL;
        int type = -1;
-       struct file_info *info;
 
        if (strcmp(path, "/proc/meminfo") == 0)
                type = LXC_TYPE_PROC_MEMINFO;
@@ -175,7 +175,7 @@ int proc_open(const char *path, struct fuse_file_info *fi)
        /* set actual size to buffer size */
        info->size = info->buflen;
 
-       fi->fh = PTR_TO_UINT64(info);
+       fi->fh = PTR_TO_UINT64(move_ptr(info));
        return 0;
 }
 
diff --git a/sysfs_fuse.c b/sysfs_fuse.c
index 599790d..988cc03 100644
--- a/sysfs_fuse.c
+++ b/sysfs_fuse.c
@@ -39,6 +39,7 @@
 #include <sys/vfs.h>
 
 #include "bindings.h"
+#include "memory_utils.h"
 #include "cgroups/cgroup.h"
 #include "config.h"
 #include "sysfs_fuse.h"
@@ -48,11 +49,10 @@ static int sys_devices_system_cpu_online_read(char *buf, 
size_t size,
                                              off_t offset,
                                              struct fuse_file_info *fi)
 {
+       __do_free char *cg = NULL, *cpuset = NULL;
        struct fuse_context *fc = fuse_get_context();
        struct file_info *d = INTTYPE_TO_PTR(fi->fh);
        char *cache = d->buf;
-       char *cg;
-       char *cpuset = NULL;
        bool use_view;
 
        int max_cpus = 0;
@@ -60,13 +60,18 @@ static int sys_devices_system_cpu_online_read(char *buf, 
size_t size,
        ssize_t total_len = 0;
 
        if (offset) {
+               int left;
+
                if (!d->cached)
                        return 0;
+
                if (offset > d->size)
                        return -EINVAL;
-               int left = d->size - offset;
+
+               left = d->size - offset;
                total_len = left > size ? size : left;
                memcpy(buf, cache + offset, total_len);
+
                return total_len;
        }
 
@@ -80,7 +85,7 @@ static int sys_devices_system_cpu_online_read(char *buf, 
size_t size,
 
        cpuset = get_cpuset(cg);
        if (!cpuset)
-               goto err;
+               return 0;
 
        use_view = cgroup_ops->can_use_cpuview(cgroup_ops);
        if (use_view)
@@ -104,27 +109,23 @@ static int sys_devices_system_cpu_online_read(char *buf, 
size_t size,
                total_len = size;
 
        memcpy(buf, d->buf, total_len);
-err:
-       free(cpuset);
-       free(cg);
+
        return total_len;
 }
 
 static off_t get_sysfile_size(const char *which)
 {
-       FILE *f;
-       char *line = NULL;
+       __do_fclose FILE *f = NULL;
+       __do_free char *line = NULL;
        size_t len = 0;
        ssize_t sz, answer = 0;
 
-       f = fopen(which, "r");
+       f = fopen(which, "re");
        if (!f)
                return 0;
 
        while ((sz = getline(&line, &len, f)) != -1)
                answer += sz;
-       fclose(f);
-       free(line);
 
        return answer;
 }
@@ -205,8 +206,8 @@ int sys_readdir(const char *path, void *buf, 
fuse_fill_dir_t filler,
 
 int sys_open(const char *path, struct fuse_file_info *fi)
 {
+       __do_free struct file_info *info = NULL;
        int type = -1;
-       struct file_info *info;
 
        if (strcmp(path, "/sys/devices") == 0)
                type = LXC_TYPE_SYS_DEVICES;
@@ -227,14 +228,16 @@ int sys_open(const char *path, struct fuse_file_info *fi)
        info->type = type;
 
        info->buflen = get_sysfile_size(path) + BUF_RESERVE_SIZE;
-       do {
-               info->buf = malloc(info->buflen);
-       } while (!info->buf);
+
+       info->buf = malloc(info->buflen);
+       if (!info->buf)
+               return -ENOMEM;
+
        memset(info->buf, 0, info->buflen);
        /* set actual size to buffer size */
        info->size = info->buflen;
 
-       fi->fh = PTR_TO_UINT64(info);
+       fi->fh = PTR_TO_UINT64(move_ptr(info));
        return 0;
 }
 
@@ -276,9 +279,12 @@ int sys_read(const char *path, char *buf, size_t size, 
off_t offset,
        case LXC_TYPE_SYS_DEVICES_SYSTEM_CPU_ONLINE:
                return sys_devices_system_cpu_online_read(buf, size, offset, 
fi);
        case LXC_TYPE_SYS_DEVICES:
+               break;
        case LXC_TYPE_SYS_DEVICES_SYSTEM:
+               break;
        case LXC_TYPE_SYS_DEVICES_SYSTEM_CPU:
-       default:
-               return -EINVAL;
+               break;
        }
+
+       return -EINVAL;
 }
diff --git a/utils.c b/utils.c
index 50c940f..e49bc4f 100644
--- a/utils.c
+++ b/utils.c
@@ -380,7 +380,7 @@ void prune_init_slice(char *cg)
        point = cg + cg_len - initscope_len;
        if (strcmp(point, INITSCOPE) == 0) {
                if (point == cg)
-                       *(point+1) = '\0';
+                       *(point + 1) = '\0';
                else
                        *point = '\0';
        }
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to