The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxc/pull/2884
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 <[email protected]>
From ebf3a6af232ed85c24a691c3da52676980930e3c Mon Sep 17 00:00:00 2001 From: Christian Brauner <[email protected]> Date: Fri, 1 Mar 2019 12:00:42 +0100 Subject: [PATCH 1/3] conf: remove fgets() from run_buffer() Signed-off-by: Christian Brauner <[email protected]> --- src/lxc/conf.c | 23 ++++++++++++++++++++--- src/lxc/utils.h | 8 ++++---- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/lxc/conf.c b/src/lxc/conf.c index c0ac73be2a..95b197e1c4 100644 --- a/src/lxc/conf.c +++ b/src/lxc/conf.c @@ -307,7 +307,7 @@ static struct limit_opt limit_opt[] = { static int run_buffer(char *buffer) { __do_free char *output = NULL; - int ret; + int fd, ret; struct lxc_popen_FILE *f; f = lxc_popen(buffer); @@ -323,8 +323,25 @@ static int run_buffer(char *buffer) return -1; } - while (fgets(output, LXC_LOG_BUFFER_SIZE, f->f)) - DEBUG("Script %s with output: %s", buffer, output); + fd = fileno(f->f); + if (fd < 0) { + SYSERROR("Failed to retrieve underlying file descriptor"); + lxc_pclose(f); + return -1; + } + + for (int i = 0; i < 10; i++) { + ssize_t bytes_read; + + bytes_read = lxc_read_nointr(fd, output, LXC_LOG_BUFFER_SIZE - 1); + if (bytes_read > 0) { + output[bytes_read] = '\0'; + DEBUG("Script %s produced output: %s", buffer, output); + continue; + } + + break; + } ret = lxc_pclose(f); if (ret == -1) { diff --git a/src/lxc/utils.h b/src/lxc/utils.h index 6314b7985a..286baaabcb 100644 --- a/src/lxc/utils.h +++ b/src/lxc/utils.h @@ -61,10 +61,10 @@ static inline int lxc_set_cloexec(int fd) return fcntl(fd, F_SETFD, FD_CLOEXEC); } -/* Struct to carry child pid from lxc_popen() to lxc_pclose(). - * Not an opaque struct to allow direct access to the underlying FILE * - * (i.e., struct lxc_popen_FILE *file; fgets(buf, sizeof(buf), file->f)) - * without additional wrappers. +/* + * Struct to carry child pid from lxc_popen() to lxc_pclose(). Not an opaque + * struct to allow direct access to the underlying FILE without additional + * wrappers. */ struct lxc_popen_FILE { int pipe; From c9c7b842a0035011d2a719c1bafa2bd6b5505838 Mon Sep 17 00:00:00 2001 From: Christian Brauner <[email protected]> Date: Fri, 1 Mar 2019 12:12:15 +0100 Subject: [PATCH 2/3] conf: remove fgets() from lxc_chroot() Signed-off-by: Christian Brauner <[email protected]> --- src/lxc/conf.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/lxc/conf.c b/src/lxc/conf.c index 95b197e1c4..9797848b8f 100644 --- a/src/lxc/conf.c +++ b/src/lxc/conf.c @@ -1364,8 +1364,6 @@ int lxc_chroot(const struct lxc_rootfs *rootfs) { __do_free char *nroot = NULL; int i, ret; - char *p, *p2; - char buf[LXC_LINELEN]; char *root = rootfs->mount; nroot = realpath(root, NULL); @@ -1405,7 +1403,10 @@ int lxc_chroot(const struct lxc_rootfs *rootfs) */ for (;;) { __do_fclose FILE *f = NULL; + char *slider1, *slider2; int progress = 0; + size_t len = 0; + char *line = NULL; f = fopen("./proc/self/mountinfo", "r"); if (!f) { @@ -1413,27 +1414,27 @@ int lxc_chroot(const struct lxc_rootfs *rootfs) return -1; } - while (fgets(buf, LXC_LINELEN, f)) { - for (p = buf, i=0; p && i < 4; i++) - p = strchr(p+1, ' '); + while (getline(&line, &len, f) > 0) { + for (slider1 = line, i = 0; slider1 && i < 4; i++) + slider1 = strchr(slider1 + 1, ' '); - if (!p) + if (!slider1) continue; - p2 = strchr(p+1, ' '); - if (!p2) + slider2 = strchr(slider1 + 1, ' '); + if (!slider2) continue; - *p2 = '\0'; - *p = '.'; + *slider2 = '\0'; + *slider1 = '.'; - if (strcmp(p + 1, "/") == 0) + if (strcmp(slider1 + 1, "/") == 0) continue; - if (strcmp(p + 1, "/proc") == 0) + if (strcmp(slider1 + 1, "/proc") == 0) continue; - ret = umount2(p, MNT_DETACH); + ret = umount2(slider1, MNT_DETACH); if (ret == 0) progress++; } From ec903c1fe406382dd00ce2a666f947b67553e7e6 Mon Sep 17 00:00:00 2001 From: Christian Brauner <[email protected]> Date: Fri, 1 Mar 2019 12:15:28 +0100 Subject: [PATCH 3/3] utils: remove fgets() from is_shared_mountpoint() Signed-off-by: Christian Brauner <[email protected]> --- src/lxc/utils.c | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/src/lxc/utils.c b/src/lxc/utils.c index be81727c3c..928dd26220 100644 --- a/src/lxc/utils.c +++ b/src/lxc/utils.c @@ -49,6 +49,7 @@ #include "config.h" #include "log.h" #include "lxclock.h" +#include "memory_utils.h" #include "namespace.h" #include "parse.h" #include "raw_syscalls.h" @@ -641,37 +642,37 @@ uint64_t fnv_64a_buf(void *buf, size_t len, uint64_t hval) bool is_shared_mountpoint(const char *path) { - char buf[LXC_LINELEN]; - FILE *f; + __do_fclose FILE *f = NULL; int i; - char *p, *p2; + char *line = NULL; + size_t len = 0; f = fopen("/proc/self/mountinfo", "r"); if (!f) return 0; - while (fgets(buf, LXC_LINELEN, f)) { - for (p = buf, i = 0; p && i < 4; i++) - p = strchr(p + 1, ' '); - if (!p) + while (getline(&line, &len, f) > 0) { + char *slider1, *slider2; + + for (slider1 = line, i = 0; slider1 && i < 4; i++) + slider1 = strchr(slider1 + 1, ' '); + + if (!slider1) continue; - p2 = strchr(p + 1, ' '); - if (!p2) + slider2 = strchr(slider1 + 1, ' '); + if (!slider2) continue; - *p2 = '\0'; - if (strcmp(p + 1, path) == 0) { + *slider2 = '\0'; + if (strcmp(slider1 + 1, path) == 0) { /* This is the path. Is it shared? */ - p = strchr(p2 + 1, ' '); - if (p && strstr(p, "shared:")) { - fclose(f); + slider1 = strchr(slider2 + 1, ' '); + if (slider1 && strstr(slider1, "shared:")) return true; - } } } - fclose(f); return false; }
_______________________________________________ lxc-devel mailing list [email protected] http://lists.linuxcontainers.org/listinfo/lxc-devel
