The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxc/pull/3317
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 eafc1bb6e60394c18cf4b8214e9fe30e1714d67c Mon Sep 17 00:00:00 2001 From: Christian Brauner <christian.brau...@ubuntu.com> Date: Fri, 20 Mar 2020 18:02:42 +0100 Subject: [PATCH 1/2] mainloop: cleanup Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com> --- src/lxc/cgroups/cgfsng.c | 4 ++-- src/lxc/mainloop.c | 32 ++++++++++++-------------------- src/lxc/mainloop.h | 12 +++--------- 3 files changed, 17 insertions(+), 31 deletions(-) diff --git a/src/lxc/cgroups/cgfsng.c b/src/lxc/cgroups/cgfsng.c index 8edaa54c9f..21abd910dd 100644 --- a/src/lxc/cgroups/cgfsng.c +++ b/src/lxc/cgroups/cgfsng.c @@ -1913,7 +1913,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 int fd = -EBADF; - __do_lxc_mainloop_close struct lxc_epoll_descr *descr_ptr = NULL; + call_cleaner(lxc_mainloop_close) struct lxc_epoll_descr *descr_ptr = NULL; int ret; struct lxc_epoll_descr descr; struct hierarchy *h; @@ -1981,7 +1981,7 @@ static int cg_legacy_unfreeze(struct cgroup_ops *ops) static int cg_unified_unfreeze(struct cgroup_ops *ops, int timeout) { __do_close int fd = -EBADF; - __do_lxc_mainloop_close struct lxc_epoll_descr *descr_ptr = NULL; + call_cleaner(lxc_mainloop_close)struct lxc_epoll_descr *descr_ptr = NULL; int ret; struct lxc_epoll_descr descr; struct hierarchy *h; diff --git a/src/lxc/mainloop.c b/src/lxc/mainloop.c index 2ef5a93e6b..6d4c5935ae 100644 --- a/src/lxc/mainloop.c +++ b/src/lxc/mainloop.c @@ -34,7 +34,7 @@ int lxc_mainloop(struct lxc_epoll_descr *descr, int timeout_ms) if (errno == EINTR) continue; - return -1; + return -errno; } for (i = 0; i < nfds; i++) { @@ -62,9 +62,9 @@ int lxc_mainloop(struct lxc_epoll_descr *descr, int timeout_ms) int lxc_mainloop_add_handler(struct lxc_epoll_descr *descr, int fd, lxc_mainloop_callback_t callback, void *data) { + __do_free struct mainloop_handler *handler = NULL; + __do_free struct lxc_list *item = NULL; struct epoll_event ev; - struct mainloop_handler *handler; - struct lxc_list *item; if (fd < 0) return -1; @@ -81,19 +81,15 @@ int lxc_mainloop_add_handler(struct lxc_epoll_descr *descr, int fd, ev.data.ptr = handler; if (epoll_ctl(descr->epfd, EPOLL_CTL_ADD, fd, &ev) < 0) - goto out_free_handler; + return -errno; item = malloc(sizeof(*item)); if (!item) - goto out_free_handler; + return ret_errno(ENOMEM); - item->elem = handler; - lxc_list_add(&descr->handlers, item); + item->elem = move_ptr(handler); + lxc_list_add(&descr->handlers, move_ptr(item)); return 0; - -out_free_handler: - free(handler); - return -1; } int lxc_mainloop_del_handler(struct lxc_epoll_descr *descr, int fd) @@ -107,7 +103,7 @@ int lxc_mainloop_del_handler(struct lxc_epoll_descr *descr, int fd) if (handler->fd == fd) { /* found */ if (epoll_ctl(descr->epfd, EPOLL_CTL_DEL, fd, NULL)) - return -1; + return -errno; lxc_list_del(iterator); free(iterator->elem); @@ -116,21 +112,20 @@ int lxc_mainloop_del_handler(struct lxc_epoll_descr *descr, int fd) } } - return -1; + return ret_errno(EINVAL); } int lxc_mainloop_open(struct lxc_epoll_descr *descr) { - /* hint value passed to epoll create */ descr->epfd = epoll_create1(EPOLL_CLOEXEC); if (descr->epfd < 0) - return -1; + return -errno; lxc_list_init(&descr->handlers); return 0; } -int lxc_mainloop_close(struct lxc_epoll_descr *descr) +void lxc_mainloop_close(struct lxc_epoll_descr *descr) { struct lxc_list *iterator, *next; @@ -144,8 +139,5 @@ int lxc_mainloop_close(struct lxc_epoll_descr *descr) iterator = next; } - if (descr->epfd >= 0) - return close(descr->epfd); - - return 0; + close_prot_errno_disarm(descr->epfd); } diff --git a/src/lxc/mainloop.h b/src/lxc/mainloop.h index a161d52aad..8afac60d35 100644 --- a/src/lxc/mainloop.h +++ b/src/lxc/mainloop.h @@ -6,6 +6,7 @@ #include <stdint.h> #include "list.h" +#include "memory_utils.h" #define LXC_MAINLOOP_ERROR -1 #define LXC_MAINLOOP_CONTINUE 0 @@ -29,15 +30,8 @@ extern int lxc_mainloop_del_handler(struct lxc_epoll_descr *descr, int fd); extern int lxc_mainloop_open(struct lxc_epoll_descr *descr); -extern int lxc_mainloop_close(struct lxc_epoll_descr *descr); +extern void lxc_mainloop_close(struct lxc_epoll_descr *descr); -static inline void __auto_lxc_mainloop_close__(struct lxc_epoll_descr **descr) -{ - if (*descr) - lxc_mainloop_close(*descr); -} - -#define __do_lxc_mainloop_close \ - __attribute__((__cleanup__(__auto_lxc_mainloop_close__))) +define_cleanup_function(struct lxc_epoll_descr *, lxc_mainloop_close); #endif From 55cf04e373662f58bdb40196a9418c7cc1166430 Mon Sep 17 00:00:00 2001 From: Christian Brauner <christian.brau...@ubuntu.com> Date: Fri, 20 Mar 2020 18:18:37 +0100 Subject: [PATCH 2/2] ringbuf: fix cleanup operations Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com> --- src/lxc/ringbuf.c | 6 +----- src/lxc/ringbuf.h | 3 ++- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/lxc/ringbuf.c b/src/lxc/ringbuf.c index 0ece4fd263..cb7513a1a6 100644 --- a/src/lxc/ringbuf.c +++ b/src/lxc/ringbuf.c @@ -20,9 +20,9 @@ int lxc_ringbuf_create(struct lxc_ringbuf *buf, size_t size) { + __do_close int memfd = -EBADF; char *tmp; int ret; - int memfd = -1; buf->size = size; buf->r_off = 0; @@ -63,14 +63,10 @@ int lxc_ringbuf_create(struct lxc_ringbuf *buf, size_t size) if (tmp == MAP_FAILED || tmp != (buf->addr + buf->size)) goto on_error; - close(memfd); - return 0; on_error: lxc_ringbuf_release(buf); - if (memfd >= 0) - close(memfd); return -1; } diff --git a/src/lxc/ringbuf.h b/src/lxc/ringbuf.h index 49041811fe..dbbc7dacae 100644 --- a/src/lxc/ringbuf.h +++ b/src/lxc/ringbuf.h @@ -36,7 +36,8 @@ extern int lxc_ringbuf_read(struct lxc_ringbuf *buf, char *out, size_t *len); static inline void lxc_ringbuf_release(struct lxc_ringbuf *buf) { - munmap(buf->addr, buf->size * 2); + if (buf->addr) + munmap(buf->addr, buf->size * 2); } static inline void lxc_ringbuf_clear(struct lxc_ringbuf *buf)
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel