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

Reply via email to