]> git.proxmox.com Git - mirror_lxcfs.git/commitdiff
tree-wide: memory utils improvements
authorChristian Brauner <christian.brauner@ubuntu.com>
Mon, 16 Mar 2020 13:05:11 +0000 (14:05 +0100)
committerChristian Brauner <christian.brauner@ubuntu.com>
Mon, 16 Mar 2020 16:31:34 +0000 (17:31 +0100)
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/bindings.c
src/cgroups/cgfsng.c
src/cgroups/cgroup2_devices.c
src/cgroups/cgroup_utils.c
src/lxcfs.c
src/macro.h
src/memory_utils.h
src/proc_fuse.c
src/proc_loadavg.c
src/utils.c

index c297f70cfa2b6d17b2a500b54e4e86c85b383ce7..115ea1fc117bbfb801fa990f38a3953519707c0a 100644 (file)
@@ -259,7 +259,7 @@ static void prune_initpid_store(void)
 static void save_initpid(struct stat *sb, pid_t pid)
 {
        __do_free struct pidns_init_store *entry = NULL;
-       __do_close_prot_errno int pidfd = -EBADF;
+       __do_close int pidfd = -EBADF;
        char path[LXCFS_PROC_PID_LEN];
        struct lxcfs_opts *opts = fuse_get_context()->private_data;
        struct stat st;
@@ -371,7 +371,7 @@ static pid_t lxcfs_clone(int (*fn)(void *), void *arg, int flags)
  */
 static void write_task_init_pid_exit(int sock, pid_t target)
 {
-       __do_close_prot_errno int fd = -EBADF;
+       __do_close int fd = -EBADF;
        char path[LXCFS_PROC_PID_NS_LEN];
        pid_t pid;
 
@@ -529,7 +529,7 @@ static bool is_on_ramfs(void)
 
 static int pivot_enter()
 {
-       __do_close_prot_errno int oldroot = -EBADF, newroot = -EBADF;
+       __do_close int oldroot = -EBADF, newroot = -EBADF;
 
        oldroot = open("/", O_DIRECTORY | O_RDONLY | O_CLOEXEC);
        if (oldroot < 0)
@@ -756,7 +756,7 @@ please_compiler:
 
 static void __attribute__((constructor)) lxcfs_init(void)
 {
-       __do_close_prot_errno int init_ns = -EBADF, root_fd = -EBADF,
+       __do_close int init_ns = -EBADF, root_fd = -EBADF,
                                  pidfd = -EBADF;
        int i = 0;
        pid_t pid;
index aba457bc80a4803e9e0b748ec6c6c1e77162c29c..6ae6c1c00c6a0cb19a5694fa127f1bbe8b31a6c9 100644 (file)
 #include "cgroup2_devices.h"
 #include "cgroup_utils.h"
 
-static void free_string_list(char **clist)
-{
-       int i;
-
-       if (!clist)
-               return;
-
-       for (i = 0; clist[i]; i++)
-               free(clist[i]);
-
-       free(clist);
-}
-
 /* Given a pointer to a null-terminated array of pointers, realloc to add one
  * entry, and point the new entry to NULL. Do not fail. Return the index to the
  * second-to-last entry - that is, the one which is now available for use
@@ -656,7 +643,7 @@ static char *readat_cpuset(int cgroup_fd)
 static int cgfsng_get_cpuset_cpus(struct cgroup_ops *ops, const char *cgroup,
                                  char **value)
 {
-       __do_close_prot_errno int cgroup_fd = -EBADF;
+       __do_close int cgroup_fd = -EBADF;
        __do_free char *path = NULL;
        char *v;
        struct hierarchy *h;
index d558b0458cabbb36b9b289a770a91fb4f8473d18..ad18dfb8efff4637b863799d9a12b3dc7e2f398c 100644 (file)
@@ -345,7 +345,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;
 
@@ -400,7 +400,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;
index 7bdf65b6bd2ca3e38fb651c6234d178edc6046fc..09bb0e63ba4f1a042d0032bf01296fee20aba5f3 100644 (file)
@@ -289,7 +289,7 @@ static int check_symlink(int fd)
  */
 static int open_if_safe(int dirfd, const char *nextpath)
 {
-       __do_close_prot_errno int newfd = -EBADF;
+       __do_close int newfd = -EBADF;
 
        newfd = openat(dirfd, nextpath, O_RDONLY | O_CLOEXEC | O_NOFOLLOW);
        if (newfd >= 0) /* Was not a symlink, all good. */
@@ -332,7 +332,7 @@ static int open_if_safe(int dirfd, const char *nextpath)
  */
 static int open_without_symlink(const char *target, const char *prefix_skip)
 {
-       __do_close_prot_errno int dirfd = -EBADF;
+       __do_close int dirfd = -EBADF;
        __do_free char *dup = NULL;
        int curlen = 0, fulllen, i;
 
@@ -399,7 +399,7 @@ static int open_without_symlink(const char *target, const char *prefix_skip)
 int safe_mount(const char *src, const char *dest, const char *fstype,
               unsigned long flags, const void *data, const char *rootfs)
 {
-       __do_close_prot_errno int destfd = -EBADF, srcfd = -EBADF;
+       __do_close int destfd = -EBADF, srcfd = -EBADF;
        int ret;
        /* Only needs enough for /proc/self/fd/<fd>. */
        char srcbuf[50], destbuf[50];
@@ -464,7 +464,7 @@ size_t strlcat(char *d, const char *s, size_t n)
 
 FILE *fopen_cloexec(const char *path, const char *mode)
 {
-       __do_close_prot_errno int fd = -EBADF;
+       __do_close int fd = -EBADF;
        __do_fclose FILE *ret = NULL;
        int open_mode = 0;
        int step = 0;
@@ -673,7 +673,7 @@ char *cg_legacy_get_current_cgroup(pid_t pid, const char *controller)
 
 char *readat_file(int dirfd, const char *path)
 {
-       __do_close_prot_errno int fd = -EBADF;
+       __do_close int fd = -EBADF;
        __do_free char *line = NULL;
        __do_fclose FILE *f = NULL;
        char *buf = NULL;
index 041cd8525618d1ac1a654fa622d54066da02e437..4dfb6b95658ab19b0e61b24e6579c689db7dff08 100644 (file)
@@ -1025,7 +1025,7 @@ static bool swallow_option(int *argcp, char *argv[], char *opt, char **v)
 
 static int set_pidfile(char *pidfile)
 {
-       __do_close_prot_errno int fd = -EBADF;
+       __do_close int fd = -EBADF;
        char buf[INTTYPE_TO_STRLEN(long)];
        int ret;
        struct flock fl = {
@@ -1060,7 +1060,7 @@ static int set_pidfile(char *pidfile)
 
 int main(int argc, char *argv[])
 {
-       __do_close_prot_errno int pidfile_fd = -EBADF;
+       int pidfile_fd = -EBADF;
        int ret = EXIT_FAILURE;
        char *pidfile = NULL, *saveptr = NULL, *token = NULL, *v = NULL;
        char pidfile_buf[STRLITERALLEN(RUNTIME_PATH) + STRLITERALLEN("/lxcfs.pid") + 1] = {};
@@ -1198,5 +1198,6 @@ out:
                dlclose(dlopen_handle);
        if (pidfile)
                unlink(pidfile);
+       close_prot_errno_disarm(pidfile_fd);
        exit(ret);
 }
index 29b5ed74991621bcf2849271013e6bfe0ceb41b8..aba00bf97ce7ea41846c74d80a62e3dc4701acf1 100644 (file)
                                    ? 20          \
                                    : sizeof(int[-2 * (sizeof(type) > 8)])))
 
+#define move_ptr(ptr)                                 \
+       ({                                            \
+               typeof(ptr) __internal_ptr__ = (ptr); \
+               (ptr) = NULL;                         \
+               __internal_ptr__;                     \
+       })
+
+#define move_fd(fd)                         \
+       ({                                  \
+               int __internal_fd__ = (fd); \
+               (fd) = -EBADF;              \
+               __internal_fd__;            \
+       })
+
 #define ret_errno(__errno__)       \
        ({                         \
                errno = __errno__; \
index 0328d18ac5be1e00ce2d5c61da6fb062f2269520..87d9c6dca67ba2c49cd1a1c97c0b46b55300c235 100644 (file)
@@ -3,42 +3,24 @@
 #ifndef __LXCFS_MEMORY_UTILS_H
 #define __LXCFS_MEMORY_UTILS_H
 
-#ifndef _GNU_SOURCE
-#define _GNU_SOURCE
-#endif
-
-#ifndef FUSE_USE_VERSION
-#define FUSE_USE_VERSION 26
-#endif
-
-#define _FILE_OFFSET_BITS 64
-
 #include <dirent.h>
 #include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 #include <sys/types.h>
 #include <unistd.h>
 
-#include "config.h"
 #include "macro.h"
 
-static inline void __auto_free__(void *p)
-{
-       free(*(void **)p);
-}
-
-static inline void __auto_fclose__(FILE **f)
-{
-       if (*f)
-               fclose(*f);
-}
+#define define_cleanup_function(type, cleaner)           \
+       static inline void cleaner##_function(type *ptr) \
+       {                                                \
+               if (*ptr)                                \
+                       cleaner(*ptr);                   \
+       }
 
-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) {              \
@@ -49,12 +31,24 @@ static inline void __auto_closedir__(DIR **d)
        }
 
 #define close_prot_errno_replace(fd, new_fd) \
-       if (fd >= 0) {                       \
-               int _e_ = errno;             \
-               close(fd);                   \
-               errno = _e_;                 \
-               fd = new_fd;                 \
-       }
+       if (fd >= 0) {                       \
+               int _e_ = errno;             \
+               close(fd);                   \
+               errno = _e_;                 \
+               fd = new_fd;                 \
+       }
+
+static inline void close_prot_errno_disarm_function(int *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 free_disarm(ptr)       \
        ({                     \
@@ -62,29 +56,30 @@ static inline void __auto_closedir__(DIR **d)
                move_ptr(ptr); \
        })
 
-static inline void __auto_close__(int *fd)
+static inline void free_disarm_function(void *ptr)
 {
-       close_prot_errno_disarm(*fd);
+       free_disarm(*(void **)ptr);
 }
+#define __do_free call_cleaner(free_disarm)
 
-#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__)))
+static inline void free_string_list(char **list)
+{
+       if (list) {
+               for (int i = 0; list[i]; i++)
+                       free(list[i]);
+               free_disarm(list);
+       }
+}
+define_cleanup_function(char **, free_string_list);
+#define __do_free_string_list call_cleaner(free_string_list)
 
-#define move_ptr(ptr)                                 \
-       ({                                            \
-               typeof(ptr) __internal_ptr__ = (ptr); \
-               (ptr) = NULL;                         \
-               __internal_ptr__;                     \
-       })
+static inline void *memdup(const void *data, size_t len)
+{
+       void *copy = NULL;
 
-#define move_fd(fd)                         \
-       ({                                  \
-               int __internal_fd__ = (fd); \
-               (fd) = -EBADF;              \
-               __internal_fd__;            \
-       })
+       copy = len ? malloc(len) : NULL;
+       return copy ? memcpy(copy, data, len) : NULL;
+}
 
 #define zalloc(__size__) (calloc(1, __size__))
 
index 728ddf051d2098e83200113b6ca417499f8801ae..c3870fb27282119e11faaaa7d0af084f70c8ced0 100644 (file)
@@ -965,7 +965,7 @@ out:
 /* Note that "memory.stat" in cgroup2 is hierarchical by default. */
 static bool cgroup_parse_memory_stat(const char *cgroup, struct memory_stat *mstat)
 {
-       __do_close_prot_errno int fd = -EBADF;
+       __do_close int fd = -EBADF;
        __do_fclose FILE *f = NULL;
        __do_free char *line = NULL;
        __do_free void *fdopen_cache = NULL;
index 0a4f6d6ceb02a22a7c2791ac310ea6c240037b92..37a8aa80bc29c4e5da989583c9f24bf51fda852c 100644 (file)
@@ -284,7 +284,7 @@ static int calc_pid(char ***pid_buf, char *dpath, int depth, int sum, int cfd)
 {
        __do_free char *path = NULL;
        __do_free void *fdopen_cache = NULL;
-       __do_close_prot_errno int fd = -EBADF;
+       __do_close int fd = -EBADF;
        __do_fclose FILE *f = NULL;
        __do_closedir DIR *dir = NULL;
        struct dirent *file;
index 5b5e0761625df88f7456c3d9be2e12356ba04c77..e54f2021776ccae61378ebd9601006154e90984c 100644 (file)
@@ -87,7 +87,7 @@ char *must_strcat(char **src, size_t *sz, size_t *asz, const char *format, ...)
  */
 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;
 
@@ -176,7 +176,7 @@ void do_release_file_info(struct fuse_file_info *fi)
 
 bool wait_for_sock(int sock, int timeout)
 {
-       __do_close_prot_errno int epfd = -EBADF;
+       __do_close int epfd = -EBADF;
        struct epoll_event ev;
        int ret, now, starttime, deltatime;
 
@@ -463,7 +463,7 @@ static char *fd_to_buf(int fd, size_t *length)
 
 static 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;