From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail.kernel.org ([198.145.29.99]:47654 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726633AbeJDGeK (ORCPT ); Thu, 4 Oct 2018 02:34:10 -0400 Date: Wed, 3 Oct 2018 16:43:35 -0700 From: Eric Biggers To: Alexander Viro Cc: linux-fsdevel@vger.kernel.org, Mimi Zohar , Dmitry Kasatkin Subject: Re: [PATCH] vfs: require i_size <= SIZE_MAX in kernel_read_file() Message-ID: <20181003234334.GC58226@gmail.com> References: <20180907191624.186623-1-ebiggers@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20180907191624.186623-1-ebiggers@kernel.org> Sender: linux-fsdevel-owner@vger.kernel.org List-ID: On Fri, Sep 07, 2018 at 12:16:24PM -0700, Eric Biggers wrote: > From: Eric Biggers > > On 32-bit systems, the buffer allocated by kernel_read_file() is too > small if the file size is > SIZE_MAX, due to truncation to size_t. > > Fortunately, since the 'count' argument to kernel_read() is also > truncated to size_t, only the allocated space is filled; then, -EIO is > returned since 'pos != i_size' after the read loop. > > But this is not obvious and seems incidental. We should be more > explicit about this case. So, fail early if i_size > SIZE_MAX. > > Signed-off-by: Eric Biggers > --- > fs/exec.c | 8 ++++---- > 1 file changed, 4 insertions(+), 4 deletions(-) > > diff --git a/fs/exec.c b/fs/exec.c > index 1ebf6e5a521d..fc281b738a98 100644 > --- a/fs/exec.c > +++ b/fs/exec.c > @@ -908,14 +908,14 @@ int kernel_read_file(struct file *file, void **buf, loff_t *size, > goto out; > > i_size = i_size_read(file_inode(file)); > - if (max_size > 0 && i_size > max_size) { > - ret = -EFBIG; > - goto out; > - } > if (i_size <= 0) { > ret = -EINVAL; > goto out; > } > + if (i_size > SIZE_MAX || (max_size > 0 && i_size > max_size)) { > + ret = -EFBIG; > + goto out; > + } > > if (id != READING_FIRMWARE_PREALLOC_BUFFER) > *buf = vmalloc(i_size); > -- Al, are you planning to apply this? - Eric