diff mbox series

exec: remove comparision of variable i_size of type loff_t against SIZE_MAX

Message ID 20200227233133.10383-1-scott.branden@broadcom.com (mailing list archive)
State New, archived
Headers show
Series exec: remove comparision of variable i_size of type loff_t against SIZE_MAX | expand

Commit Message

Scott Branden Feb. 27, 2020, 11:31 p.m. UTC
Remove comparision of (i_size > SIZE_MAX).
i_size is of type loff_t and can not be great than SIZE_MAX (~(size_t)0).

Signed-off-by: Scott Branden <scott.branden@broadcom.com>
---
 fs/exec.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Eric Biggers Feb. 27, 2020, 11:39 p.m. UTC | #1
On Thu, Feb 27, 2020 at 03:31:33PM -0800, Scott Branden wrote:
> Remove comparision of (i_size > SIZE_MAX).
> i_size is of type loff_t and can not be great than SIZE_MAX (~(size_t)0).
> 
> Signed-off-by: Scott Branden <scott.branden@broadcom.com>
> ---
>  fs/exec.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/fs/exec.c b/fs/exec.c
> index db17be51b112..16c229752f74 100644
> --- a/fs/exec.c
> +++ b/fs/exec.c
> @@ -919,7 +919,7 @@ int kernel_read_file(struct file *file, void **buf, loff_t *size,
>  		ret = -EINVAL;
>  		goto out;
>  	}
> -	if (i_size > SIZE_MAX || (max_size > 0 && i_size > max_size)) {
> +	if (max_size > 0 && i_size > max_size) {
>  		ret = -EFBIG;
>  		goto out;
>  	}

Nope, loff_t is 64-bit while size_t can be 32-bit.  And this check is
intentional, see https://git.kernel.org/torvalds/c/691115c3513ec83e

- Eric
Al Viro Feb. 27, 2020, 11:40 p.m. UTC | #2
On Thu, Feb 27, 2020 at 03:31:33PM -0800, Scott Branden wrote:
> Remove comparision of (i_size > SIZE_MAX).
> i_size is of type loff_t and can not be great than SIZE_MAX (~(size_t)0).

include/linux/types.h:46:typedef __kernel_loff_t                loff_t;
include/uapi/asm-generic/posix_types.h:88:typedef long long     __kernel_loff_t;

And boxen with size_t smaller than long long do exist.  Anything
32bit will qualify.  Pick any such and check that yourself...
Scott Branden Feb. 27, 2020, 11:49 p.m. UTC | #3
On 2020-02-27 3:40 p.m., Al Viro wrote:
> On Thu, Feb 27, 2020 at 03:31:33PM -0800, Scott Branden wrote:
>> Remove comparision of (i_size > SIZE_MAX).
>> i_size is of type loff_t and can not be great than SIZE_MAX (~(size_t)0).
> include/linux/types.h:46:typedef __kernel_loff_t                loff_t;
> include/uapi/asm-generic/posix_types.h:88:typedef long long     __kernel_loff_t;
>
> And boxen with size_t smaller than long long do exist.  Anything
> 32bit will qualify.  Pick any such and check that yourself...
Thanks for the immediate responses.  I'm glad I sent this patch out to 
understand the check is as such.
Is there some attribute we can add so such issues are not reported 
against static analysis tools such as coverity?
diff mbox series

Patch

diff --git a/fs/exec.c b/fs/exec.c
index db17be51b112..16c229752f74 100644
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -919,7 +919,7 @@  int kernel_read_file(struct file *file, void **buf, loff_t *size,
 		ret = -EINVAL;
 		goto out;
 	}
-	if (i_size > SIZE_MAX || (max_size > 0 && i_size > max_size)) {
+	if (max_size > 0 && i_size > max_size) {
 		ret = -EFBIG;
 		goto out;
 	}