From: Lennart Poettering Date: Fri, 21 May 2021 14:30:52 +0000 (+0200) Subject: fileio: if we try to read a file larger than SIZE_MAX this is not a problem if a... X-Git-Tag: v249-rc1~177^2~6 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=1b5e91a8d217bef68d6b2b4244e6ace354898a99;p=thirdparty%2Fsystemd.git fileio: if we try to read a file larger than SIZE_MAX this is not a problem if a max_size is specified i.e. 32bit userspace reading /proc/kcore on a 64bit kernel with max_size should not needlessly fail. --- diff --git a/src/basic/fileio.c b/src/basic/fileio.c index 853e679aaa8..7bb1e8a8c6e 100644 --- a/src/basic/fileio.c +++ b/src/basic/fileio.c @@ -405,12 +405,18 @@ int read_virtual_file(const char *filename, size_t max_size, char **ret_contents /* Be prepared for files from /proc which generally report a file size of 0. */ assert_cc(READ_FULL_BYTES_MAX < SSIZE_MAX); if (st.st_size > 0) { - if (st.st_size > SSIZE_MAX) /* Avoid overflow with 32-bit size_t and 64-bit off_t. */ - return -EFBIG; + if (st.st_size > SSIZE_MAX) { /* Avoid overflow with 32-bit size_t and 64-bit off_t. */ - size = MIN((size_t) st.st_size, max_size); - if (size > READ_FULL_BYTES_MAX) - return -EFBIG; + if (max_size == SIZE_MAX) + return -EFBIG; + + size = max_size; + } else { + size = MIN((size_t) st.st_size, max_size); + + if (size > READ_FULL_BYTES_MAX) + return -EFBIG; + } n_retries--; } else {