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)
__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);