The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/7027
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 81ca13881a08f86a3b9af6d3f9dcf7a2fdebe0c8 Mon Sep 17 00:00:00 2001 From: Christian Brauner <christian.brau...@ubuntu.com> Date: Sun, 15 Mar 2020 16:04:26 +0100 Subject: [PATCH 1/2] memory_utils: align lxc + lxd Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com> --- lxd/include/memory_utils.h | 69 ++++++++++++++------------------ lxd/main_checkfeature.go | 8 ++-- lxd/main_forkfile.go | 2 +- lxd/main_forkmount.go | 2 +- lxd/main_forksyscall.go | 14 +++---- lxd/main_forkuevent.go | 4 +- lxd/main_nsexec.go | 10 ++--- lxd/storage/drivers/utils_cgo.go | 8 ++-- shared/idmap/shift_linux.go | 2 +- 9 files changed, 54 insertions(+), 65 deletions(-) diff --git a/lxd/include/memory_utils.h b/lxd/include/memory_utils.h index c1dafb441a..8f2d9fd3c4 100644 --- a/lxd/include/memory_utils.h +++ b/lxd/include/memory_utils.h @@ -1,22 +1,5 @@ -/* liblxcapi - * - * Copyright © 2019 Christian Brauner <christian.brau...@ubuntu.com>. - * Copyright © 2019 Canonical Ltd. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - - * You should have received a copy of the GNU Lesser General Public License - * along with this library; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ +// SPDX-License-Identifier: LGPL-2.1+ +/* Copyright © 2019 Christian Brauner <christian.brau...@ubuntu.com>. */ #ifndef __LXC_MEMORY_UTILS_H #define __LXC_MEMORY_UTILS_H @@ -30,22 +13,14 @@ #include "macro.h" -static inline void __auto_free__(void *p) -{ - free(*(void **)p); -} +#define define_cleanup_function(type, cleaner) \ + static inline void cleaner##_function(type *ptr) \ + { \ + if (*ptr) \ + cleaner(*ptr); \ + } -static inline void __auto_fclose__(FILE **f) -{ - if (*f) - fclose(*f); -} - -static inline void __auto_closedir__(DIR **d) -{ - if (*d) - closedir(*d); -} +#define call_cleaner(cleaner) __attribute__((__cleanup__(cleaner##_function))) #define close_prot_errno_disarm(fd) \ if (fd >= 0) { \ @@ -55,14 +30,28 @@ static inline void __auto_closedir__(DIR **d) fd = -EBADF; \ } -static inline void __auto_close__(int *fd) +static inline void close_prot_errno_disarm_function(int *fd) { - close_prot_errno_disarm(*fd); + close_prot_errno_disarm(*fd); } +#define __do_close call_cleaner(close_prot_errno_disarm) + +define_cleanup_function(FILE *, fclose); +#define __do_fclose call_cleaner(fclose) + +define_cleanup_function(DIR *, closedir); +#define __do_closedir call_cleaner(closedir) -#define __do_close_prot_errno __attribute__((__cleanup__(__auto_close__))) -#define __do_free __attribute__((__cleanup__(__auto_free__))) -#define __do_fclose __attribute__((__cleanup__(__auto_fclose__))) -#define __do_closedir __attribute__((__cleanup__(__auto_closedir__))) +#define free_disarm(ptr) \ + ({ \ + free(ptr); \ + move_ptr(ptr); \ + }) + +static inline void free_disarm_function(void *ptr) +{ + free_disarm(*(void **)ptr); +} +#define __do_free call_cleaner(free_disarm) #endif /* __LXC_MEMORY_UTILS_H */ diff --git a/lxd/main_checkfeature.go b/lxd/main_checkfeature.go index ac167bdbbc..2a63708d52 100644 --- a/lxd/main_checkfeature.go +++ b/lxd/main_checkfeature.go @@ -42,7 +42,7 @@ extern int wait_for_pid(pid_t pid); static int netns_set_nsid(int fd) { - __do_close_prot_errno int sockfd = -EBADF; + __do_close int sockfd = -EBADF; int ret; char buf[NLMSG_ALIGN(sizeof(struct nlmsghdr)) + NLMSG_ALIGN(sizeof(struct rtgenmsg)) + @@ -79,7 +79,7 @@ static int netns_set_nsid(int fd) void is_netnsid_aware(int *hostnetns_fd, int *newnetns_fd) { - __do_close_prot_errno int sock_fd = -EBADF; + __do_close int sock_fd = -EBADF; int netnsid, ret; *hostnetns_fd = open("/proc/self/ns/net", O_RDONLY | O_CLOEXEC); @@ -172,7 +172,7 @@ static int filecmp(pid_t pid1, pid_t pid2, int fd1, int fd2) __noreturn static void __do_user_notification_continue(void) { - __do_close_prot_errno int listener = -EBADF; + __do_close int listener = -EBADF; pid_t pid; int ret; struct seccomp_notif req = {}; @@ -293,7 +293,7 @@ static void is_seccomp_notify_aware(void) void checkfeature(void) { - __do_close_prot_errno int hostnetns_fd = -EBADF, newnetns_fd = -EBADF; + __do_close int hostnetns_fd = -EBADF, newnetns_fd = -EBADF; is_netnsid_aware(&hostnetns_fd, &newnetns_fd); is_uevent_aware(); diff --git a/lxd/main_forkfile.go b/lxd/main_forkfile.go index 28d547ac88..24b3f32743 100644 --- a/lxd/main_forkfile.go +++ b/lxd/main_forkfile.go @@ -59,7 +59,7 @@ int copy(int target, int source, bool append) } int manip_file_in_ns(char *rootfs, int pid, char *host, char *container, bool is_put, char *type, uid_t uid, gid_t gid, mode_t mode, uid_t defaultUid, gid_t defaultGid, mode_t defaultMode, bool append) { - __do_close_prot_errno int host_fd = -1, container_fd = -1; + __do_close int host_fd = -1, container_fd = -1; int ret = -1; int container_open_flags; struct stat st; diff --git a/lxd/main_forkmount.go b/lxd/main_forkmount.go index a7929dd2da..8a293acc7c 100644 --- a/lxd/main_forkmount.go +++ b/lxd/main_forkmount.go @@ -78,7 +78,7 @@ void ensure_dir(char *dest) { void ensure_file(char *dest) { - __do_close_prot_errno int fd = -EBADF; + __do_close int fd = -EBADF; struct stat sb; if (stat(dest, &sb) == 0) { diff --git a/lxd/main_forksyscall.go b/lxd/main_forksyscall.go index 8682406912..feb68a39e9 100644 --- a/lxd/main_forksyscall.go +++ b/lxd/main_forksyscall.go @@ -60,7 +60,7 @@ static bool chdirchroot_in_mntns(int cwd_fd, int root_fd) static bool acquire_basic_creds(pid_t pid) { - __do_close_prot_errno int cwd_fd = -EBADF, mnt_fd = -EBADF, root_fd = -EBADF; + __do_close int cwd_fd = -EBADF, mnt_fd = -EBADF, root_fd = -EBADF; char buf[256]; snprintf(buf, sizeof(buf), "/proc/%d/ns/mnt", pid); @@ -139,7 +139,7 @@ static bool acquire_final_creds(pid_t pid, uid_t uid, gid_t gid, uid_t fsuid, gi // <PID> <root-uid> <root-gid> <path> <mode> <dev> static void mknod_emulate(void) { - __do_close_prot_errno int target_dir_fd = -EBADF; + __do_close int target_dir_fd = -EBADF; char *target = NULL, *target_dir = NULL; int ret; char path[PATH_MAX]; @@ -209,7 +209,7 @@ const char *ns_names[] = { "user", "pid", "uts", "ipc", "net", "cgroup", NULL }; static bool setnsat(int ns_fd, const char *ns) { - __do_close_prot_errno int fd = -EBADF; + __do_close int fd = -EBADF; fd = openat(ns_fd, ns, O_RDONLY | O_CLOEXEC); if (fd < 0) @@ -220,7 +220,7 @@ static bool setnsat(int ns_fd, const char *ns) static bool change_creds(int ns_fd, cap_t caps, uid_t nsuid, gid_t nsgid, uid_t nsfsuid, gid_t nsfsgid) { - __do_close_prot_errno int fd = -EBADF; + __do_close int fd = -EBADF; if (prctl(PR_SET_KEEPCAPS, 1)) return false; @@ -248,7 +248,7 @@ static bool change_creds(int ns_fd, cap_t caps, uid_t nsuid, gid_t nsgid, uid_t static void setxattr_emulate(void) { - __do_close_prot_errno int ns_fd = -EBADF, target_fd = -EBADF; + __do_close int ns_fd = -EBADF, target_fd = -EBADF; int flags = 0; char *name, *target; char path[PATH_MAX]; @@ -341,7 +341,7 @@ static bool is_dir(const char *path) static int make_tmpfile(char *template, bool dir) { - __do_close_prot_errno int fd = -EBADF; + __do_close int fd = -EBADF; if (dir) { if (!mkdtemp(template)) @@ -380,7 +380,7 @@ static int preserve_ns(const int pid, const char *ns) static void mount_emulate(void) { - __do_close_prot_errno int mnt_fd = -EBADF; + __do_close int mnt_fd = -EBADF; char *source = NULL, *shiftfs = NULL, *target = NULL, *fstype = NULL; bool use_fuse; uid_t uid = -1, fsuid = -1; diff --git a/lxd/main_forkuevent.go b/lxd/main_forkuevent.go index 1b78125cfa..a25c533808 100644 --- a/lxd/main_forkuevent.go +++ b/lxd/main_forkuevent.go @@ -82,7 +82,7 @@ static void *nlmsg_reserve_unaligned(struct nlmsg *nlmsg, size_t len) int can_inject_uevent(const char *uevent, size_t len) { - __do_close_prot_errno int sock_fd = -EBADF; + __do_close int sock_fd = -EBADF; __do_free struct nlmsg *nlmsg = NULL; int ret; char *umsg = NULL; @@ -115,7 +115,7 @@ int can_inject_uevent(const char *uevent, size_t len) static int inject_uevent(const char *uevent, size_t len) { - __do_close_prot_errno int sock_fd = -EBADF; + __do_close int sock_fd = -EBADF; __do_free struct nlmsg *nlmsg = NULL; int ret; char *umsg = NULL; diff --git a/lxd/main_nsexec.go b/lxd/main_nsexec.go index 79ce48570e..2e8fa92fca 100644 --- a/lxd/main_nsexec.go +++ b/lxd/main_nsexec.go @@ -101,7 +101,7 @@ void error(char *msg) } int dosetns(int pid, char *nstype) { - __do_close_prot_errno int ns_fd = -EBADF; + __do_close int ns_fd = -EBADF; char buf[PATH_MAX]; sprintf(buf, "/proc/%d/ns/%s", pid, nstype); @@ -120,7 +120,7 @@ int dosetns(int pid, char *nstype) { } int dosetns_file(char *file, char *nstype) { - __do_close_prot_errno int ns_fd = -EBADF; + __do_close int ns_fd = -EBADF; ns_fd = open(file, O_RDONLY); if (ns_fd < 0) { @@ -167,7 +167,7 @@ static int preserve_ns(const int pid, const char *ns) // in the same namespace returns -EINVAL, -1 if an error occurred. static int in_same_namespace(pid_t pid1, pid_t pid2, const char *ns) { - __do_close_prot_errno int ns_fd1 = -1, ns_fd2 = -1; + __do_close int ns_fd1 = -1, ns_fd2 = -1; int ret = -1; struct stat ns_st1, ns_st2; @@ -202,7 +202,7 @@ static int in_same_namespace(pid_t pid1, pid_t pid2, const char *ns) } void attach_userns(int pid) { - __do_close_prot_errno int userns_fd = -EBADF; + __do_close int userns_fd = -EBADF; int ret; userns_fd = in_same_namespace(getpid(), pid, "user"); @@ -251,7 +251,7 @@ again: static char *file_to_buf(char *path, ssize_t *length) { - __do_close_prot_errno int fd = -EBADF; + __do_close int fd = -EBADF; __do_free char *copy = NULL; char buf[PATH_MAX]; diff --git a/lxd/storage/drivers/utils_cgo.go b/lxd/storage/drivers/utils_cgo.go index c6f9928134..dd571aed7a 100644 --- a/lxd/storage/drivers/utils_cgo.go +++ b/lxd/storage/drivers/utils_cgo.go @@ -53,7 +53,7 @@ static int find_associated_loop_device(const char *loop_file, return -1; while ((dp = readdir(dir))) { - __do_close_prot_errno int loop_path_fd = -EBADF; + __do_close int loop_path_fd = -EBADF; int ret; size_t totlen; struct stat fstatbuf; @@ -120,7 +120,7 @@ static int get_unused_loop_dev_legacy(char *loop_name) return -1; while ((dp = readdir(dir))) { - __do_close_prot_errno int dfd = -EBADF, fd = -EBADF; + __do_close int dfd = -EBADF, fd = -EBADF; int ret; if (!dp) @@ -154,7 +154,7 @@ static int get_unused_loop_dev_legacy(char *loop_name) static int get_unused_loop_dev(char *name_loop) { - __do_close_prot_errno int fd_ctl = -1; + __do_close int fd_ctl = -1; int loop_nr, ret; fd_ctl = open("/dev/loop-control", O_RDWR | O_CLOEXEC); @@ -174,7 +174,7 @@ static int get_unused_loop_dev(char *name_loop) static int prepare_loop_dev(const char *source, char *loop_dev, int flags) { - __do_close_prot_errno int fd_img = -1, fd_loop = -1; + __do_close int fd_img = -1, fd_loop = -1; int ret; struct loop_info64 lo64; diff --git a/shared/idmap/shift_linux.go b/shared/idmap/shift_linux.go index 5069a509e8..a83660e807 100644 --- a/shared/idmap/shift_linux.go +++ b/shared/idmap/shift_linux.go @@ -95,7 +95,7 @@ int set_dummy_fs_ns_caps(const char *path) int shiftowner(char *basepath, char *path, int uid, int gid) { - __do_close_prot_errno int fd = -EBADF; + __do_close int fd = -EBADF; int ret; char fdpath[PATH_MAX], realpath[PATH_MAX]; struct stat sb; From 93e4bf63b58e61016d0130ebcad38be4becaa1f0 Mon Sep 17 00:00:00 2001 From: Christian Brauner <christian.brau...@ubuntu.com> Date: Sun, 15 Mar 2020 16:06:45 +0100 Subject: [PATCH 2/2] tree-wide: consistently initialize raw fds to -EBADF instead of -1 in cgo Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com> --- lxd/main_forkfile.go | 2 +- lxd/main_nsexec.go | 2 +- lxd/storage/drivers/utils_cgo.go | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lxd/main_forkfile.go b/lxd/main_forkfile.go index 24b3f32743..1b27e0ca34 100644 --- a/lxd/main_forkfile.go +++ b/lxd/main_forkfile.go @@ -59,7 +59,7 @@ int copy(int target, int source, bool append) } int manip_file_in_ns(char *rootfs, int pid, char *host, char *container, bool is_put, char *type, uid_t uid, gid_t gid, mode_t mode, uid_t defaultUid, gid_t defaultGid, mode_t defaultMode, bool append) { - __do_close int host_fd = -1, container_fd = -1; + __do_close int host_fd = -EBADF, container_fd = -EBADF; int ret = -1; int container_open_flags; struct stat st; diff --git a/lxd/main_nsexec.go b/lxd/main_nsexec.go index 2e8fa92fca..9efc3af825 100644 --- a/lxd/main_nsexec.go +++ b/lxd/main_nsexec.go @@ -167,7 +167,7 @@ static int preserve_ns(const int pid, const char *ns) // in the same namespace returns -EINVAL, -1 if an error occurred. static int in_same_namespace(pid_t pid1, pid_t pid2, const char *ns) { - __do_close int ns_fd1 = -1, ns_fd2 = -1; + __do_close int ns_fd1 = -EBADF, ns_fd2 = -EBADF; int ret = -1; struct stat ns_st1, ns_st2; diff --git a/lxd/storage/drivers/utils_cgo.go b/lxd/storage/drivers/utils_cgo.go index dd571aed7a..8c3bd7ce86 100644 --- a/lxd/storage/drivers/utils_cgo.go +++ b/lxd/storage/drivers/utils_cgo.go @@ -154,7 +154,7 @@ static int get_unused_loop_dev_legacy(char *loop_name) static int get_unused_loop_dev(char *name_loop) { - __do_close int fd_ctl = -1; + __do_close int fd_ctl = -EBADF; int loop_nr, ret; fd_ctl = open("/dev/loop-control", O_RDWR | O_CLOEXEC); @@ -174,7 +174,7 @@ static int get_unused_loop_dev(char *name_loop) static int prepare_loop_dev(const char *source, char *loop_dev, int flags) { - __do_close int fd_img = -1, fd_loop = -1; + __do_close int fd_img = -EBADF, fd_loop = -EBADF; int ret; struct loop_info64 lo64;
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel