]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
caps: ensure \0-termination 3997/head
authorChristian Brauner <christian.brauner@ubuntu.com>
Fri, 15 Oct 2021 09:29:27 +0000 (11:29 +0200)
committerChristian Brauner <christian.brauner@ubuntu.com>
Fri, 15 Oct 2021 09:29:27 +0000 (11:29 +0200)
Fixes: Coverity 1492865
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/caps.c
src/lxc/file_utils.h

index 5a7619300fb276ded94a49f4bdc8eb604bdb6031..a99048864ca9c1a544b513eeb2c98eb829fef269 100644 (file)
@@ -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)
index 7d2af012815ef8e4242f2ec29db35d4693a49eb1..e169ab8b0f076d31f600e8085c46286f155f9381 100644 (file)
@@ -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);