From a031a4e14fa40b051ca9debf0886114905afbebc Mon Sep 17 00:00:00 2001 From: Christian Brauner Date: Fri, 15 Oct 2021 11:29:27 +0200 Subject: [PATCH] caps: ensure \0-termination Fixes: Coverity 1492865 Signed-off-by: Christian Brauner --- src/lxc/caps.c | 8 ++++---- src/lxc/file_utils.h | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/lxc/caps.c b/src/lxc/caps.c index 5a7619300..a99048864 100644 --- a/src/lxc/caps.c +++ b/src/lxc/caps.c @@ -228,11 +228,11 @@ static int __caps_last_cap(__u32 *cap) if (fd >= 0) { ssize_t ret; unsigned int res; - char buf[INTTYPE_TO_STRLEN(unsigned int)] = {0}; + char buf[INTTYPE_TO_STRLEN(unsigned int)]; - ret = lxc_read_nointr(fd, buf, STRARRAYLEN(buf)); - if (ret <= 0) - return syserror_set(EINVAL, "Failed to read \"/proc/sys/kernel/cap_last_cap\""); + ret = lxc_read_string_nointr(fd, buf, STRARRAYLEN(buf)); + if (ret) + return syserror("Failed to read \"/proc/sys/kernel/cap_last_cap\""); ret = lxc_safe_uint(lxc_trim_whitespace_in_place(buf), &res); if (ret < 0) diff --git a/src/lxc/file_utils.h b/src/lxc/file_utils.h index 7d2af0128..e169ab8b0 100644 --- a/src/lxc/file_utils.h +++ b/src/lxc/file_utils.h @@ -45,6 +45,22 @@ __hidden extern ssize_t lxc_send_nointr(int sockfd, void *buf, size_t len, int f __hidden extern ssize_t lxc_read_nointr(int fd, void *buf, size_t count) __access_w(2, 3); +__access_w(2, 3) static inline int lxc_read_string_nointr(int fd, char *buf, + size_t count) +{ + ssize_t ret; + + ret = lxc_read_nointr(fd, buf, STRARRAYLEN(buf)); + if (ret < 0) + return -errno; + if (ret == 0) + return ret_errno(ENODATA); + if ((size_t)ret >= sizeof(buf)) + return ret_errno(E2BIG); + buf[ret] = '\0'; + return 0; +} + __hidden extern ssize_t lxc_read_nointr_expect(int fd, void *buf, size_t count, const void *expected_buf) __access_w(2, 3); -- 2.47.2