From: Christian Brauner Date: Fri, 1 Mar 2019 11:00:42 +0000 (+0100) Subject: conf: remove fgets() from run_buffer() X-Git-Tag: lxc-3.2.0~124^2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ebf3a6af232ed85c24a691c3da52676980930e3c;p=thirdparty%2Flxc.git conf: remove fgets() from run_buffer() Signed-off-by: Christian Brauner --- diff --git a/src/lxc/conf.c b/src/lxc/conf.c index c0ac73be2..95b197e1c 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 6314b7985..286baaabc 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;