The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxc/pull/3294
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 e16ad728f827f87175918cc3cfa6e67f46a3acd1 Mon Sep 17 00:00:00 2001 From: Christian Brauner <christian.brau...@ubuntu.com> Date: Sun, 15 Mar 2020 01:28:22 +0100 Subject: [PATCH 1/6] memory_utils: add call_cleaner() helper This allows to trivially declare cleanup attributes on the fly. Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com> --- src/lxc/memory_utils.h | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/lxc/memory_utils.h b/src/lxc/memory_utils.h index 196c957a5f..5968eee1e0 100644 --- a/src/lxc/memory_utils.h +++ b/src/lxc/memory_utils.h @@ -12,13 +12,15 @@ #include "macro.h" -#define define_cleanup_attribute(type, func) \ - static inline void func##_ptr(type *ptr) \ - { \ - if (*ptr) \ - func(*ptr); \ +#define define_cleanup_function(type, cleaner) \ + static inline void cleaner##_function(type *ptr) \ + { \ + if (*ptr) \ + cleaner(*ptr); \ } +#define call_cleaner(cleaner) __attribute__((__cleanup__(cleaner##_function))) + #define free_disarm(ptr) \ ({ \ free(ptr); \ @@ -38,8 +40,9 @@ static inline void free_string_list(char **list) free_disarm(list); } } -define_cleanup_attribute(char **, free_string_list); -#define __do_free_string_list __attribute__((__cleanup__(free_string_list_ptr))) +define_cleanup_function(char **, free_string_list); +#define __do_free_string_list \ + __attribute__((__cleanup__(free_string_list_function))) static inline void __auto_fclose__(FILE **f) { From 1e22a68300fb2bfac51c283d59eac4b002c75e8a Mon Sep 17 00:00:00 2001 From: Christian Brauner <christian.brau...@ubuntu.com> Date: Sun, 15 Mar 2020 01:37:32 +0100 Subject: [PATCH 2/6] caps: port to call_cleaner() based cleanup Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com> --- src/lxc/caps.c | 181 ++++++++++++++++--------------------------------- 1 file changed, 58 insertions(+), 123 deletions(-) diff --git a/src/lxc/caps.c b/src/lxc/caps.c index 34547304a1..b3ab37a1f5 100644 --- a/src/lxc/caps.c +++ b/src/lxc/caps.c @@ -15,14 +15,17 @@ #include "file_utils.h" #include "log.h" #include "macro.h" +#include "memory_utils.h" lxc_log_define(caps, lxc); #if HAVE_LIBCAP +define_cleanup_function(cap_t, cap_free); + int lxc_caps_down(void) { - cap_t caps; + call_cleaner(cap_free) cap_t caps = NULL; int ret = -1; /* When we are root, we don't want to play with capabilities. */ @@ -30,34 +33,23 @@ int lxc_caps_down(void) return 0; caps = cap_get_proc(); - if (!caps) { - SYSERROR("Failed to retrieve capabilities"); - return ret; - } + if (!caps) + return log_error_errno(ret, errno, "Failed to retrieve capabilities"); ret = cap_clear_flag(caps, CAP_EFFECTIVE); - if (ret) { - SYSERROR("Failed to clear effective capabilities"); - goto on_error; - } + if (ret) + return log_error_errno(ret, errno, "Failed to clear effective capabilities"); ret = cap_set_proc(caps); - if (ret) { - SYSERROR("Failed to change effective capabilities"); - goto on_error; - } - - ret = 0; + if (ret) + return log_error_errno(ret, errno, "Failed to change effective capabilities"); -on_error: - cap_free(caps); - - return ret; + return 0; } int lxc_caps_up(void) { - cap_t caps; + call_cleaner(cap_free) cap_t caps = NULL; cap_value_t cap; int ret = -1; @@ -66,10 +58,8 @@ int lxc_caps_up(void) return 0; caps = cap_get_proc(); - if (!caps) { - SYSERROR("Failed to retrieve capabilities"); - return ret; - } + if (!caps) + return log_error_errno(ret, errno, "Failed to retrieve capabilities"); for (cap = 0; cap <= CAP_LAST_CAP; cap++) { cap_flag_value_t flag; @@ -80,49 +70,36 @@ int lxc_caps_up(void) INFO("Last supported cap was %d", cap - 1); break; } else { - SYSERROR("Failed to retrieve setting for " - "permitted capability %d", cap - 1); - goto on_error; + return log_error_errno(ret, errno, "Failed to retrieve setting for permitted capability %d", cap - 1); } } ret = cap_set_flag(caps, CAP_EFFECTIVE, 1, &cap, flag); - if (ret) { - SYSERROR("Failed to set effective capability %d", cap - 1); - goto on_error; - } + if (ret) + return log_error_errno(ret, errno, "Failed to set effective capability %d", cap - 1); } ret = cap_set_proc(caps); - if (ret) { - SYSERROR("Failed to change effective capabilities"); - goto on_error; - } - - ret = 0; - -on_error: - cap_free(caps); + if (ret) + return log_error_errno(ret, errno, "Failed to change effective capabilities"); - return ret; + return 0; } int lxc_ambient_caps_up(void) { + call_cleaner(cap_free) cap_t caps = NULL; + __do_free char *cap_names = NULL; int ret; - cap_t caps; cap_value_t cap; int last_cap = CAP_LAST_CAP; - char *cap_names = NULL; if (!getuid() || geteuid()) return 0; caps = cap_get_proc(); - if (!caps) { - SYSERROR("Failed to retrieve capabilities"); - return -1; - } + if (!caps) + return log_error_errno(-1, errno, "Failed to retrieve capabilities"); for (cap = 0; cap <= CAP_LAST_CAP; cap++) { cap_flag_value_t flag; @@ -135,51 +112,37 @@ int lxc_ambient_caps_up(void) break; } - SYSERROR("Failed to retrieve capability flag"); - goto out; + return log_error_errno(ret, errno, "Failed to retrieve capability flag"); } ret = cap_set_flag(caps, CAP_INHERITABLE, 1, &cap, flag); - if (ret < 0) { - SYSERROR("Failed to set capability flag"); - goto out; - } + if (ret < 0) + return log_error_errno(ret, errno, "Failed to set capability flag"); } ret = cap_set_proc(caps); - if (ret < 0) { - SYSERROR("Failed to set capabilities"); - goto out; - } + if (ret < 0) + return log_error_errno(ret, errno, "Failed to set capabilities"); for (cap = 0; cap <= last_cap; cap++) { ret = prctl(PR_CAP_AMBIENT, prctl_arg(PR_CAP_AMBIENT_RAISE), prctl_arg(cap), prctl_arg(0), prctl_arg(0)); - if (ret < 0) { - SYSWARN("Failed to raise ambient capability %d", cap); - goto out; - } + if (ret < 0) + return log_warn_errno(ret, errno, "Failed to raise ambient capability %d", cap); } cap_names = cap_to_text(caps, NULL); - if (!cap_names) { - SYSWARN("Failed to convert capabilities %d", cap); - goto out; - } + if (!cap_names) + return log_warn_errno(0, errno, "Failed to convert capabilities %d", cap); TRACE("Raised %s in inheritable and ambient capability set", cap_names); - -out: - - cap_free(cap_names); - cap_free(caps); return 0; } int lxc_ambient_caps_down(void) { + call_cleaner(cap_free) cap_t caps = NULL; int ret; - cap_t caps; cap_value_t cap; if (!getuid() || geteuid()) @@ -187,33 +150,23 @@ int lxc_ambient_caps_down(void) ret = prctl(PR_CAP_AMBIENT, prctl_arg(PR_CAP_AMBIENT_CLEAR_ALL), prctl_arg(0), prctl_arg(0), prctl_arg(0)); - if (ret < 0) { - SYSERROR("Failed to clear ambient capability set"); - return -1; - } + if (ret < 0) + return log_error_errno(-1, errno, "Failed to clear ambient capability set"); caps = cap_get_proc(); - if (!caps) { - SYSERROR("Failed to retrieve capabilities"); - return -1; - } + if (!caps) + return log_error_errno(-1, errno, "Failed to retrieve capabilities"); for (cap = 0; cap <= CAP_LAST_CAP; cap++) { ret = cap_set_flag(caps, CAP_INHERITABLE, 1, &cap, CAP_CLEAR); - if (ret < 0) { - SYSERROR("Failed to remove capability from inheritable set"); - goto out; - } + if (ret < 0) + return log_error_errno(-1, errno, "Failed to clear capability"); } ret = cap_set_proc(caps); - if (ret < 0) { - SYSERROR("Failed to set capabilities"); - goto out; - } + if (ret < 0) + return log_error_errno(ret, errno, "Failed to set capabilities"); -out: - cap_free(caps); return 0; } @@ -233,29 +186,21 @@ int lxc_caps_init(void) INFO("Command is run as setuid root (uid: %d)", uid); ret = prctl(PR_SET_KEEPCAPS, prctl_arg(1)); - if (ret < 0) { - SYSERROR("Failed to set PR_SET_KEEPCAPS"); - return -1; - } + if (ret < 0) + return log_error_errno(-1, errno, "Failed to set PR_SET_KEEPCAPS"); gid = getgid(); ret = setresgid(gid, gid, gid); - if (ret < 0) { - SYSERROR("Failed to change rgid, egid, and sgid to %d", gid); - return -1; - } + if (ret < 0) + return log_error_errno(-1, errno, "Failed to change rgid, egid, and sgid to %d", gid); ret = setresuid(uid, uid, uid); - if (ret < 0) { - SYSERROR("Failed to change ruid, euid, and suid to %d", uid); - return -1; - } + if (ret < 0) + return log_error_errno(-1, errno, "Failed to change ruid, euid, and suid to %d", uid); ret = lxc_caps_up(); - if (ret < 0) { - SYSERROR("Failed to restore capabilities"); - return -1; - } + if (ret < 0) + return log_error_errno(-1, errno, "Failed to restore capabilities"); } if (uid == euid) @@ -320,10 +265,8 @@ static bool lxc_cap_is_set(cap_t caps, cap_value_t cap, cap_flag_t flag) cap_flag_value_t flagval; ret = cap_get_flag(caps, cap, flag, &flagval); - if (ret < 0) { - SYSERROR("Failed to retrieve current setting for capability %d", cap); - return false; - } + if (ret < 0) + return log_error_errno(false, errno, "Failed to retrieve current setting for capability %d", cap); return flagval == CAP_SET; } @@ -331,8 +274,7 @@ static bool lxc_cap_is_set(cap_t caps, cap_value_t cap, cap_flag_t flag) bool lxc_file_cap_is_set(const char *path, cap_value_t cap, cap_flag_t flag) { #if LIBCAP_SUPPORTS_FILE_CAPABILITIES - bool cap_is_set; - cap_t caps; + call_cleaner(cap_free) cap_t caps = NULL; caps = cap_get_file(path); if (!caps) { @@ -347,9 +289,7 @@ bool lxc_file_cap_is_set(const char *path, cap_value_t cap, cap_flag_t flag) return false; } - cap_is_set = lxc_cap_is_set(caps, cap, flag); - cap_free(caps); - return cap_is_set; + return lxc_cap_is_set(caps, cap, flag); #else errno = ENODATA; return false; @@ -358,17 +298,12 @@ bool lxc_file_cap_is_set(const char *path, cap_value_t cap, cap_flag_t flag) bool lxc_proc_cap_is_set(cap_value_t cap, cap_flag_t flag) { - bool cap_is_set; - cap_t caps; + call_cleaner(cap_free) cap_t caps = NULL; caps = cap_get_proc(); - if (!caps) { - SYSERROR("Failed to retrieve capabilities"); - return false; - } + if (!caps) + return log_error_errno(false, errno, "Failed to retrieve capabilities"); - cap_is_set = lxc_cap_is_set(caps, cap, flag); - cap_free(caps); - return cap_is_set; + return lxc_cap_is_set(caps, cap, flag); } #endif From 5a07663367606d138d62323e245cf289706640f6 Mon Sep 17 00:00:00 2001 From: Christian Brauner <christian.brau...@ubuntu.com> Date: Sun, 15 Mar 2020 01:55:24 +0100 Subject: [PATCH 3/6] tree-wide: port cgroup cleanup to call_cleaner(cgroup_exit) Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com> --- src/lxc/attach.c | 2 +- src/lxc/cgroups/cgroup.h | 11 +++-------- src/lxc/freezer.c | 2 +- src/lxc/lxccontainer.c | 21 ++++++--------------- 4 files changed, 11 insertions(+), 25 deletions(-) diff --git a/src/lxc/attach.c b/src/lxc/attach.c index 26fd753ecc..d147a59ed1 100644 --- a/src/lxc/attach.c +++ b/src/lxc/attach.c @@ -1176,7 +1176,7 @@ int lxc_attach(struct lxc_container *container, lxc_attach_exec_t exec_function, */ ret = cgroup_attach(name, lxcpath, pid); if (ret) { - __do_cgroup_exit struct cgroup_ops *cgroup_ops = NULL; + call_cleaner(cgroup_exit) struct cgroup_ops *cgroup_ops = NULL; cgroup_ops = cgroup_init(conf); if (!cgroup_ops) diff --git a/src/lxc/cgroups/cgroup.h b/src/lxc/cgroups/cgroup.h index 309f31fae7..9f44ad51ba 100644 --- a/src/lxc/cgroups/cgroup.h +++ b/src/lxc/cgroups/cgroup.h @@ -8,6 +8,7 @@ #include <sys/types.h> #include "macro.h" +#include "memory_utils.h" #define DEFAULT_CGROUP_MOUNTPOINT "/sys/fs/cgroup" #define DEFAULT_PAYLOAD_CGROUP_PREFIX "lxc.payload." @@ -171,20 +172,14 @@ struct cgroup_ops { }; extern struct cgroup_ops *cgroup_init(struct lxc_conf *conf); + extern void cgroup_exit(struct cgroup_ops *ops); +define_cleanup_function(struct cgroup_ops *, cgroup_exit); extern void prune_init_scope(char *cg); -static inline void __auto_cgroup_exit__(struct cgroup_ops **ops) -{ - if (*ops) - cgroup_exit(*ops); -} - extern int cgroup_attach(const char *name, const char *lxcpath, int64_t pid); -#define __do_cgroup_exit __attribute__((__cleanup__(__auto_cgroup_exit__))) - static inline bool pure_unified_layout(const struct cgroup_ops *ops) { return ops->cgroup_layout == CGROUP_LAYOUT_UNIFIED; diff --git a/src/lxc/freezer.c b/src/lxc/freezer.c index 13b7756158..dbb70f61df 100644 --- a/src/lxc/freezer.c +++ b/src/lxc/freezer.c @@ -35,7 +35,7 @@ static void notify_state_listeners(const char *name, const char *lxcpath, static int do_freeze_thaw(bool freeze, struct lxc_conf *conf, const char *name, const char *lxcpath) { - __do_cgroup_exit struct cgroup_ops *cgroup_ops = NULL; + call_cleaner(cgroup_exit) struct cgroup_ops *cgroup_ops = NULL; lxc_state_t new_state = freeze ? FROZEN : THAWED; int ret; const char *state; diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c index 0c69670aae..42e3b562f7 100644 --- a/src/lxc/lxccontainer.c +++ b/src/lxc/lxccontainer.c @@ -3308,8 +3308,7 @@ WRAP_API_1(bool, lxcapi_set_config_path, const char *) static bool do_lxcapi_set_cgroup_item(struct lxc_container *c, const char *subsys, const char *value) { - int ret; - struct cgroup_ops *cgroup_ops; + call_cleaner(cgroup_exit) struct cgroup_ops *cgroup_ops = NULL; if (!c) return false; @@ -3321,19 +3320,15 @@ static bool do_lxcapi_set_cgroup_item(struct lxc_container *c, const char *subsy if (!cgroup_ops) return false; - ret = cgroup_ops->set(cgroup_ops, subsys, value, c->name, c->config_path); - - cgroup_exit(cgroup_ops); - - return ret == 0; + return cgroup_ops->set(cgroup_ops, subsys, value, c->name, + c->config_path) == 0; } WRAP_API_2(bool, lxcapi_set_cgroup_item, const char *, const char *) static int do_lxcapi_get_cgroup_item(struct lxc_container *c, const char *subsys, char *retv, int inlen) { - int ret; - struct cgroup_ops *cgroup_ops; + call_cleaner(cgroup_exit) struct cgroup_ops *cgroup_ops = NULL; if (!c) return -1; @@ -3345,12 +3340,8 @@ static int do_lxcapi_get_cgroup_item(struct lxc_container *c, const char *subsys if (!cgroup_ops) return -1; - ret = cgroup_ops->get(cgroup_ops, subsys, retv, inlen, c->name, - c->config_path); - - cgroup_exit(cgroup_ops); - - return ret; + return cgroup_ops->get(cgroup_ops, subsys, retv, inlen, c->name, + c->config_path); } WRAP_API_3(int, lxcapi_get_cgroup_item, const char *, char *, int) From 6e87cb176f72c13f97807636690cefa9a5744b03 Mon Sep 17 00:00:00 2001 From: Christian Brauner <christian.brau...@ubuntu.com> Date: Sun, 15 Mar 2020 02:34:20 +0100 Subject: [PATCH 4/6] memory_utils: adapt to new infrastructure Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com> --- src/lxc/memory_utils.h | 58 +++++++++++++++++------------------------- 1 file changed, 24 insertions(+), 34 deletions(-) diff --git a/src/lxc/memory_utils.h b/src/lxc/memory_utils.h index 5968eee1e0..6758864fd6 100644 --- a/src/lxc/memory_utils.h +++ b/src/lxc/memory_utils.h @@ -21,16 +21,37 @@ #define call_cleaner(cleaner) __attribute__((__cleanup__(cleaner##_function))) +#define close_prot_errno_disarm(fd) \ + if (fd >= 0) { \ + int _e_ = errno; \ + close(fd); \ + errno = _e_; \ + fd = -EBADF; \ + } + +static inline void close_prot_errno_disarm_function(int *fd) +{ + close_prot_errno_disarm(*fd); +} +#define __do_close_prot_errno 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 free_disarm(ptr) \ ({ \ free(ptr); \ move_ptr(ptr); \ }) -static inline void __auto_free__(void *p) +static inline void free_disarm_function(void *ptr) { - free(*(void **)p); + free_disarm(*(void **)ptr); } +#define __do_free call_cleaner(free_disarm) static inline void free_string_list(char **list) { @@ -41,38 +62,7 @@ static inline void free_string_list(char **list) } } define_cleanup_function(char **, free_string_list); -#define __do_free_string_list \ - __attribute__((__cleanup__(free_string_list_function))) - -static inline void __auto_fclose__(FILE **f) -{ - if (*f) - fclose(*f); -} - -static inline void __auto_closedir__(DIR **d) -{ - if (*d) - closedir(*d); -} - -#define close_prot_errno_disarm(fd) \ - if (fd >= 0) { \ - int _e_ = errno; \ - close(fd); \ - errno = _e_; \ - fd = -EBADF; \ - } - -static inline void __auto_close__(int *fd) -{ - close_prot_errno_disarm(*fd); -} - -#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 __do_free_string_list call_cleaner(free_string_list) static inline void *memdup(const void *data, size_t len) { From f62cf1d486bf02319aea25ae4ecdfc3fd3c2125a Mon Sep 17 00:00:00 2001 From: Christian Brauner <christian.brau...@ubuntu.com> Date: Sun, 15 Mar 2020 02:38:36 +0100 Subject: [PATCH 5/6] tree-wide: s/__do_close_prot_errno/__do_close/g Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com> --- src/lxc/af_unix.c | 6 +++--- src/lxc/attach.c | 2 +- src/lxc/cgroups/cgfsng.c | 16 ++++++++-------- src/lxc/cgroups/cgroup2_devices.c | 4 ++-- src/lxc/cmd/lxc_user_nic.c | 2 +- src/lxc/commands.c | 14 +++++++------- src/lxc/commands_utils.c | 2 +- src/lxc/conf.c | 10 +++++----- src/lxc/file_utils.c | 20 ++++++++++---------- src/lxc/lxccontainer.c | 8 ++++---- src/lxc/memory_utils.h | 2 +- src/lxc/rexec.c | 4 ++-- src/lxc/seccomp.c | 8 ++++---- src/lxc/start.c | 8 ++++---- src/lxc/terminal.c | 2 +- src/lxc/utils.c | 4 ++-- src/lxc/uuid.c | 2 +- 17 files changed, 57 insertions(+), 57 deletions(-) diff --git a/src/lxc/af_unix.c b/src/lxc/af_unix.c index 04aef44ade..e17208888a 100644 --- a/src/lxc/af_unix.c +++ b/src/lxc/af_unix.c @@ -53,7 +53,7 @@ static ssize_t lxc_abstract_unix_set_sockaddr(struct sockaddr_un *addr, int lxc_abstract_unix_open(const char *path, int type, int flags) { - __do_close_prot_errno int fd = -EBADF; + __do_close int fd = -EBADF; int ret; ssize_t len; struct sockaddr_un addr; @@ -90,7 +90,7 @@ void lxc_abstract_unix_close(int fd) int lxc_abstract_unix_connect(const char *path) { - __do_close_prot_errno int fd = -EBADF; + __do_close int fd = -EBADF; int ret; ssize_t len; struct sockaddr_un addr; @@ -326,7 +326,7 @@ int lxc_unix_sockaddr(struct sockaddr_un *ret, const char *path) int lxc_unix_connect_type(struct sockaddr_un *addr, int type) { - __do_close_prot_errno int fd = -EBADF; + __do_close int fd = -EBADF; int ret; ssize_t len; diff --git a/src/lxc/attach.c b/src/lxc/attach.c index d147a59ed1..d9da4ad81e 100644 --- a/src/lxc/attach.c +++ b/src/lxc/attach.c @@ -131,7 +131,7 @@ static void lxc_proc_put_context_info(struct lxc_proc_context_info *ctx) */ 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; diff --git a/src/lxc/cgroups/cgfsng.c b/src/lxc/cgroups/cgfsng.c index 462ee3696c..b78779ef77 100644 --- a/src/lxc/cgroups/cgfsng.c +++ b/src/lxc/cgroups/cgfsng.c @@ -494,7 +494,7 @@ static int cg_legacy_handle_cpuset_hierarchy(struct hierarchy *h, const char *cgroup_leaf) { __do_free char *parent_cgroup = NULL, *child_cgroup = NULL, *dup = NULL; - __do_close_prot_errno int cgroup_fd = -EBADF; + __do_close int cgroup_fd = -EBADF; int fret = -1; int ret; char v; @@ -1169,10 +1169,10 @@ static void cgroup_remove_leaf(struct hierarchy *h, bool payload) __do_free char *full_path = NULL; if (payload) { - __lxc_unused __do_close_prot_errno int fd = move_fd(h->cgfd_con); + __lxc_unused __do_close int fd = move_fd(h->cgfd_con); full_path = move_ptr(h->container_full_path); } else { - __lxc_unused __do_close_prot_errno int fd = move_fd(h->cgfd_mon); + __lxc_unused __do_close int fd = move_fd(h->cgfd_mon); full_path = move_ptr(h->monitor_full_path); } @@ -1866,7 +1866,7 @@ static bool cg_legacy_freeze(struct cgroup_ops *ops) static int freezer_cgroup_events_cb(int fd, uint32_t events, void *cbdata, struct lxc_epoll_descr *descr) { - __do_close_prot_errno int duped_fd = -EBADF; + __do_close int duped_fd = -EBADF; __do_free char *line = NULL; __do_fclose FILE *f = NULL; int state = PTR_TO_INT(cbdata); @@ -1899,7 +1899,7 @@ static int freezer_cgroup_events_cb(int fd, uint32_t events, void *cbdata, static int cg_unified_freeze(struct cgroup_ops *ops, int timeout) { - __do_close_prot_errno int fd = -EBADF; + __do_close int fd = -EBADF; __do_lxc_mainloop_close struct lxc_epoll_descr *descr_ptr = NULL; int ret; struct lxc_epoll_descr descr; @@ -1967,7 +1967,7 @@ static int cg_legacy_unfreeze(struct cgroup_ops *ops) static int cg_unified_unfreeze(struct cgroup_ops *ops, int timeout) { - __do_close_prot_errno int fd = -EBADF; + __do_close int fd = -EBADF; __do_lxc_mainloop_close struct lxc_epoll_descr *descr_ptr = NULL; int ret; struct lxc_epoll_descr descr; @@ -2099,7 +2099,7 @@ static int cgroup_attach_leaf(int unified_fd, int64_t pid) int cgroup_attach(const char *name, const char *lxcpath, int64_t pid) { - __do_close_prot_errno int unified_fd = -EBADF; + __do_close int unified_fd = -EBADF; unified_fd = lxc_cmd_get_cgroup2_fd(name, lxcpath); if (unified_fd < 0) @@ -2121,7 +2121,7 @@ static int __cg_unified_attach(const struct hierarchy *h, const char *name, const char *lxcpath, pid_t pid, const char *controller) { - __do_close_prot_errno int unified_fd = -EBADF; + __do_close int unified_fd = -EBADF; int ret; ret = cgroup_attach(name, lxcpath, pid); diff --git a/src/lxc/cgroups/cgroup2_devices.c b/src/lxc/cgroups/cgroup2_devices.c index eef4647b09..11e2bdd986 100644 --- a/src/lxc/cgroups/cgroup2_devices.c +++ b/src/lxc/cgroups/cgroup2_devices.c @@ -341,7 +341,7 @@ int bpf_program_cgroup_attach(struct bpf_program *prog, int type, const char *path, uint32_t flags) { __do_free char *copy = NULL; - __do_close_prot_errno int fd = -EBADF; + __do_close int fd = -EBADF; union bpf_attr attr; int ret; @@ -396,7 +396,7 @@ int bpf_program_cgroup_attach(struct bpf_program *prog, int type, int bpf_program_cgroup_detach(struct bpf_program *prog) { int ret; - __do_close_prot_errno int fd = -EBADF; + __do_close int fd = -EBADF; if (!prog) return 0; diff --git a/src/lxc/cmd/lxc_user_nic.c b/src/lxc/cmd/lxc_user_nic.c index f2388a5b4c..7a2e47011b 100644 --- a/src/lxc/cmd/lxc_user_nic.c +++ b/src/lxc/cmd/lxc_user_nic.c @@ -73,7 +73,7 @@ __noreturn static void usage(bool fail) static int open_and_lock(const char *path) { - __do_close_prot_errno int fd = -EBADF; + __do_close int fd = -EBADF; int ret; struct flock lk; diff --git a/src/lxc/commands.c b/src/lxc/commands.c index 08fada3ac2..204af14f30 100644 --- a/src/lxc/commands.c +++ b/src/lxc/commands.c @@ -111,7 +111,7 @@ static const char *lxc_cmd_str(lxc_cmd_t cmd) */ static int lxc_cmd_rsp_recv(int sock, struct lxc_cmd_rr *cmd) { - __do_close_prot_errno int fd_rsp = -EBADF; + __do_close int fd_rsp = -EBADF; int ret; struct lxc_cmd_rsp *rsp = &cmd->rsp; @@ -214,7 +214,7 @@ static int lxc_cmd_rsp_send(int fd, struct lxc_cmd_rsp *rsp) static int lxc_cmd_send(const char *name, struct lxc_cmd_rr *cmd, const char *lxcpath, const char *hashed_sock_name) { - __do_close_prot_errno int client_fd = -EBADF; + __do_close int client_fd = -EBADF; ssize_t ret = -1; client_fd = lxc_cmd_connect(name, lxcpath, hashed_sock_name, "command"); @@ -267,7 +267,7 @@ static int lxc_cmd_send(const char *name, struct lxc_cmd_rr *cmd, static int lxc_cmd(const char *name, struct lxc_cmd_rr *cmd, int *stopped, const char *lxcpath, const char *hashed_sock_name) { - __do_close_prot_errno int client_fd = -EBADF; + __do_close int client_fd = -EBADF; int ret = -1; bool stay_connected = false; @@ -898,7 +898,7 @@ int lxc_cmd_add_state_client(const char *name, const char *lxcpath, lxc_state_t states[MAX_STATE], int *state_client_fd) { - __do_close_prot_errno int clientfd = -EBADF; + __do_close int clientfd = -EBADF; int state, stopped; ssize_t ret; struct lxc_cmd_rr cmd = { @@ -1217,7 +1217,7 @@ static int lxc_cmd_seccomp_notify_add_listener_callback(int fd, #ifdef HAVE_SECCOMP_NOTIFY int ret; - __do_close_prot_errno int recv_fd = -EBADF; + __do_close int recv_fd = -EBADF; ret = lxc_abstract_unix_recv_fds(fd, &recv_fd, 1, NULL, 0); if (ret <= 0) { @@ -1505,7 +1505,7 @@ static int lxc_cmd_handler(int fd, uint32_t events, void *data, static int lxc_cmd_accept(int fd, uint32_t events, void *data, struct lxc_epoll_descr *descr) { - __do_close_prot_errno int connection = -EBADF; + __do_close int connection = -EBADF; int opt = 1, ret = -1; connection = accept(fd, NULL, 0); @@ -1531,7 +1531,7 @@ static int lxc_cmd_accept(int fd, uint32_t events, void *data, int lxc_cmd_init(const char *name, const char *lxcpath, const char *suffix) { - __do_close_prot_errno int fd = -EBADF; + __do_close int fd = -EBADF; int ret; char path[LXC_AUDS_ADDR_LEN] = {0}; diff --git a/src/lxc/commands_utils.c b/src/lxc/commands_utils.c index dbc06bf334..2f2670d748 100644 --- a/src/lxc/commands_utils.c +++ b/src/lxc/commands_utils.c @@ -57,7 +57,7 @@ int lxc_cmd_sock_rcv_state(int state_client_fd, int timeout) int lxc_cmd_sock_get_state(const char *name, const char *lxcpath, lxc_state_t states[MAX_STATE], int timeout) { - __do_close_prot_errno int state_client_fd = -EBADF; + __do_close int state_client_fd = -EBADF; int ret; ret = lxc_cmd_add_state_client(name, lxcpath, states, &state_client_fd); diff --git a/src/lxc/conf.c b/src/lxc/conf.c index 0113079f45..08e6da29e9 100644 --- a/src/lxc/conf.c +++ b/src/lxc/conf.c @@ -1380,7 +1380,7 @@ int lxc_chroot(const struct lxc_rootfs *rootfs) */ static int lxc_pivot_root(const char *rootfs) { - __do_close_prot_errno int oldroot = -EBADF, newroot = -EBADF; + __do_close int oldroot = -EBADF, newroot = -EBADF; int ret; oldroot = open("/", O_DIRECTORY | O_RDONLY | O_CLOEXEC); @@ -2193,7 +2193,7 @@ static const char nesting_helpers[] = FILE *make_anonymous_mount_file(struct lxc_list *mount, bool include_nesting_helpers) { - __do_close_prot_errno int fd = -EBADF; + __do_close int fd = -EBADF; FILE *f; int ret; char *mount_entry; @@ -2567,12 +2567,12 @@ struct lxc_conf *lxc_conf_init(void) int write_id_mapping(enum idtype idtype, pid_t pid, const char *buf, size_t buf_size) { - __do_close_prot_errno int fd = -EBADF; + __do_close int fd = -EBADF; int ret; char path[PATH_MAX]; if (geteuid() != 0 && idtype == ID_TYPE_GID) { - __do_close_prot_errno int setgroups_fd = -EBADF; + __do_close int setgroups_fd = -EBADF; ret = snprintf(path, PATH_MAX, "/proc/%d/setgroups", pid); if (ret < 0 || ret >= PATH_MAX) @@ -3018,7 +3018,7 @@ void remount_all_slave(void) { __do_free char *line = NULL; __do_fclose FILE *f = NULL; - __do_close_prot_errno int memfd = -EBADF, mntinfo_fd = -EBADF; + __do_close int memfd = -EBADF, mntinfo_fd = -EBADF; int ret; ssize_t copied; size_t len = 0; diff --git a/src/lxc/file_utils.c b/src/lxc/file_utils.c index 747e5c18cf..ab445751bd 100644 --- a/src/lxc/file_utils.c +++ b/src/lxc/file_utils.c @@ -27,7 +27,7 @@ int lxc_open_dirfd(const char *dir) int lxc_readat(int dirfd, const char *filename, void *buf, size_t count) { - __do_close_prot_errno int fd = -EBADF; + __do_close int fd = -EBADF; ssize_t ret; fd = openat(dirfd, filename, O_RDONLY | O_CLOEXEC); @@ -43,7 +43,7 @@ int lxc_readat(int dirfd, const char *filename, void *buf, size_t count) int lxc_writeat(int dirfd, const char *filename, const void *buf, size_t count) { - __do_close_prot_errno int fd = -EBADF; + __do_close int fd = -EBADF; ssize_t ret; fd = openat(dirfd, filename, @@ -61,7 +61,7 @@ int lxc_writeat(int dirfd, const char *filename, const void *buf, size_t count) int lxc_write_openat(const char *dir, const char *filename, const void *buf, size_t count) { - __do_close_prot_errno int dirfd = -EBADF; + __do_close int dirfd = -EBADF; dirfd = open(dir, O_DIRECTORY | O_RDONLY | O_CLOEXEC | O_NOCTTY | O_NOFOLLOW); if (dirfd < 0) @@ -73,7 +73,7 @@ int lxc_write_openat(const char *dir, const char *filename, const void *buf, int lxc_write_to_file(const char *filename, const void *buf, size_t count, bool add_newline, mode_t mode) { - __do_close_prot_errno int fd = -EBADF; + __do_close int fd = -EBADF; ssize_t ret; fd = open(filename, O_WRONLY | O_TRUNC | O_CREAT | O_CLOEXEC, mode); @@ -98,7 +98,7 @@ int lxc_write_to_file(const char *filename, const void *buf, size_t count, int lxc_read_from_file(const char *filename, void *buf, size_t count) { - __do_close_prot_errno int fd = -EBADF; + __do_close int fd = -EBADF; ssize_t ret; fd = open(filename, O_RDONLY | O_CLOEXEC); @@ -203,7 +203,7 @@ ssize_t lxc_read_nointr_expect(int fd, void *buf, size_t count, ssize_t lxc_read_file_expect(const char *path, void *buf, size_t count, const void *expected_buf) { - __do_close_prot_errno int fd = -EBADF; + __do_close int fd = -EBADF; fd = open(path, O_RDONLY | O_CLOEXEC); if (fd < 0) @@ -268,7 +268,7 @@ int lxc_count_file_lines(const char *fn) int lxc_make_tmpfile(char *template, bool rm) { - __do_close_prot_errno int fd = -EBADF; + __do_close int fd = -EBADF; int ret; mode_t msk; @@ -322,7 +322,7 @@ bool fhas_fs_type(int fd, fs_type_magic magic_val) FILE *fopen_cloexec(const char *path, const char *mode) { - __do_close_prot_errno int fd = -EBADF; + __do_close int fd = -EBADF; int open_mode = 0, step = 0; FILE *f; @@ -430,7 +430,7 @@ static char *fd_to_buf(int fd, size_t *length) char *file_to_buf(const char *path, size_t *length) { - __do_close_prot_errno int fd = -EBADF; + __do_close int fd = -EBADF; if (!length) return NULL; @@ -482,7 +482,7 @@ FILE *fdopen_cached(int fd, const char *mode, void **caller_freed_buffer) #else - __do_close_prot_errno int dupfd = -EBADF; + __do_close int dupfd = -EBADF; dupfd = dup(fd); if (dupfd < 0) diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c index 42e3b562f7..06a1eb9b61 100644 --- a/src/lxc/lxccontainer.c +++ b/src/lxc/lxccontainer.c @@ -140,7 +140,7 @@ enum { static int ongoing_create(struct lxc_container *c) { - __do_close_prot_errno int fd = -EBADF; + __do_close int fd = -EBADF; __do_free char *path = NULL; struct flock lk = {0}; int ret; @@ -1976,7 +1976,7 @@ static bool lxcapi_create(struct lxc_container *c, const char *t, static bool do_lxcapi_reboot(struct lxc_container *c) { - __do_close_prot_errno int pidfd = -EBADF; + __do_close int pidfd = -EBADF; pid_t pid = -1; int ret; int rebootsignal = SIGINT; @@ -2012,7 +2012,7 @@ WRAP_API(bool, lxcapi_reboot) static bool do_lxcapi_reboot2(struct lxc_container *c, int timeout) { - __do_close_prot_errno int pidfd = -EBADF, state_client_fd = -EBADF; + __do_close int pidfd = -EBADF, state_client_fd = -EBADF; int rebootsignal = SIGINT; pid_t pid = -1; lxc_state_t states[MAX_STATE] = {0}; @@ -2081,7 +2081,7 @@ WRAP_API_1(bool, lxcapi_reboot2, int) static bool do_lxcapi_shutdown(struct lxc_container *c, int timeout) { - __do_close_prot_errno int pidfd = -EBADF, state_client_fd = -EBADF; + __do_close int pidfd = -EBADF, state_client_fd = -EBADF; int haltsignal = SIGPWR; pid_t pid = -1; lxc_state_t states[MAX_STATE] = {0}; diff --git a/src/lxc/memory_utils.h b/src/lxc/memory_utils.h index 6758864fd6..29878fb67d 100644 --- a/src/lxc/memory_utils.h +++ b/src/lxc/memory_utils.h @@ -33,7 +33,7 @@ static inline void close_prot_errno_disarm_function(int *fd) { close_prot_errno_disarm(*fd); } -#define __do_close_prot_errno call_cleaner(close_prot_errno_disarm) +#define __do_close call_cleaner(close_prot_errno_disarm) define_cleanup_function(FILE *, fclose); #define __do_fclose call_cleaner(fclose) diff --git a/src/lxc/rexec.c b/src/lxc/rexec.c index 00b5f142e5..c9c84b8c1a 100644 --- a/src/lxc/rexec.c +++ b/src/lxc/rexec.c @@ -65,7 +65,7 @@ static int parse_argv(char ***argv) static int is_memfd(void) { - __do_close_prot_errno int fd = -EBADF; + __do_close int fd = -EBADF; int seals; fd = open("/proc/self/exe", O_RDONLY | O_CLOEXEC); @@ -87,7 +87,7 @@ static int is_memfd(void) static void lxc_rexec_as_memfd(char **argv, char **envp, const char *memfd_name) { - __do_close_prot_errno int execfd = -EBADF, fd = -EBADF, memfd = -EBADF, + __do_close int execfd = -EBADF, fd = -EBADF, memfd = -EBADF, tmpfd = -EBADF; int ret; ssize_t bytes_sent = 0; diff --git a/src/lxc/seccomp.c b/src/lxc/seccomp.c index 0c56ec5caf..6aedb5274d 100644 --- a/src/lxc/seccomp.c +++ b/src/lxc/seccomp.c @@ -1299,7 +1299,7 @@ void lxc_seccomp_free(struct lxc_seccomp *seccomp) #if HAVE_DECL_SECCOMP_NOTIFY_FD static int seccomp_notify_reconnect(struct lxc_handler *handler) { - __do_close_prot_errno int notify_fd = -EBADF; + __do_close int notify_fd = -EBADF; close_prot_errno_disarm(handler->conf->seccomp.notifier.proxy_fd); @@ -1338,8 +1338,8 @@ int seccomp_notify_handler(int fd, uint32_t events, void *data, { #if HAVE_DECL_SECCOMP_NOTIFY_FD - __do_close_prot_errno int fd_pid = -EBADF; - __do_close_prot_errno int fd_mem = -EBADF; + __do_close int fd_pid = -EBADF; + __do_close int fd_mem = -EBADF; int ret; ssize_t bytes; int send_fd_list[2]; @@ -1514,7 +1514,7 @@ int lxc_seccomp_setup_proxy(struct lxc_seccomp *seccomp, #if HAVE_DECL_SECCOMP_NOTIFY_FD if (seccomp->notifier.wants_supervision && seccomp->notifier.proxy_addr.sun_path[1] != '\0') { - __do_close_prot_errno int notify_fd = -EBADF; + __do_close int notify_fd = -EBADF; int ret; notify_fd = lxc_unix_connect_type(&seccomp->notifier.proxy_addr, diff --git a/src/lxc/start.c b/src/lxc/start.c index 2e6f8c6d42..75ccddd855 100644 --- a/src/lxc/start.c +++ b/src/lxc/start.c @@ -724,7 +724,7 @@ struct lxc_handler *lxc_init_handler(const char *name, struct lxc_conf *conf, int lxc_init(const char *name, struct lxc_handler *handler) { - __do_close_prot_errno int status_fd = -EBADF; + __do_close int status_fd = -EBADF; int ret; const char *loglevel; struct lxc_conf *conf = handler->conf; @@ -1053,9 +1053,9 @@ void lxc_abort(const char *name, struct lxc_handler *handler) static int do_start(void *data) { struct lxc_handler *handler = data; - __lxc_unused __do_close_prot_errno int data_sock0 = handler->data_sock[0], + __lxc_unused __do_close int data_sock0 = handler->data_sock[0], data_sock1 = handler->data_sock[1]; - __do_close_prot_errno int status_fd = -EBADF; + __do_close int status_fd = -EBADF; int ret; uid_t new_uid; gid_t new_gid; @@ -1557,7 +1557,7 @@ static inline int do_share_ns(void *arg) */ static int lxc_spawn(struct lxc_handler *handler) { - __do_close_prot_errno int data_sock0 = -EBADF, data_sock1 = -EBADF; + __do_close int data_sock0 = -EBADF, data_sock1 = -EBADF; int i, ret; char pidstr[20]; bool wants_to_map_ids; diff --git a/src/lxc/terminal.c b/src/lxc/terminal.c index 26b2d50d7c..1b170cabe8 100644 --- a/src/lxc/terminal.c +++ b/src/lxc/terminal.c @@ -94,7 +94,7 @@ int lxc_terminal_signalfd_cb(int fd, uint32_t events, void *cbdata, struct lxc_terminal_state *lxc_terminal_signal_init(int srcfd, int dstfd) { - __do_close_prot_errno int signal_fd = -EBADF; + __do_close int signal_fd = -EBADF; __do_free struct lxc_terminal_state *ts = NULL; int ret; sigset_t mask; diff --git a/src/lxc/utils.c b/src/lxc/utils.c index 7d996e3677..a3b5f128f1 100644 --- a/src/lxc/utils.c +++ b/src/lxc/utils.c @@ -635,7 +635,7 @@ int detect_shared_rootfs(void) bool switch_to_ns(pid_t pid, const char *ns) { - __do_close_prot_errno int fd = -EBADF; + __do_close int fd = -EBADF; int ret; char nspath[STRLITERALLEN("/proc//ns/") + INTTYPE_TO_STRLEN(pid_t) @@ -1642,7 +1642,7 @@ uint64_t lxc_find_next_power2(uint64_t n) static int process_dead(/* takes */ int status_fd) { - __do_close_prot_errno int dupfd = -EBADF; + __do_close int dupfd = -EBADF; __do_free char *line = NULL; __do_fclose FILE *f = NULL; int ret = 0; diff --git a/src/lxc/uuid.c b/src/lxc/uuid.c index fa96b1a042..414a003414 100644 --- a/src/lxc/uuid.c +++ b/src/lxc/uuid.c @@ -39,7 +39,7 @@ static lxc_id128_t make_v4_uuid(lxc_id128_t id) static int get_random_bytes(void *p, size_t n) { - __do_close_prot_errno int fd = -1; + __do_close int fd = -1; ssize_t bytes = 0; fd = open("/dev/urandom", O_RDONLY | O_CLOEXEC | O_NOCTTY); From 644e73938557147ae8295b145cbd4edd8e23e252 Mon Sep 17 00:00:00 2001 From: Christian Brauner <christian.brau...@ubuntu.com> Date: Sun, 15 Mar 2020 02:40:13 +0100 Subject: [PATCH 6/6] tree-wide: remove last -1 fd initialization with cleanup macros in favor of -EBADF Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com> --- src/lxc/attach.c | 2 +- src/lxc/uuid.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lxc/attach.c b/src/lxc/attach.c index d9da4ad81e..083f709bb5 100644 --- a/src/lxc/attach.c +++ b/src/lxc/attach.c @@ -131,7 +131,7 @@ static void lxc_proc_put_context_info(struct lxc_proc_context_info *ctx) */ 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/src/lxc/uuid.c b/src/lxc/uuid.c index 414a003414..a5d24bbcba 100644 --- a/src/lxc/uuid.c +++ b/src/lxc/uuid.c @@ -39,7 +39,7 @@ static lxc_id128_t make_v4_uuid(lxc_id128_t id) static int get_random_bytes(void *p, size_t n) { - __do_close int fd = -1; + __do_close int fd = -EBADF; ssize_t bytes = 0; fd = open("/dev/urandom", O_RDONLY | O_CLOEXEC | O_NOCTTY);
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel