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

Reply via email to