2020-02-27 23:32:14

by Scott Branden

[permalink] [raw]
Subject: [PATCH] exec: remove comparision of variable i_size of type loff_t against SIZE_MAX

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 <[email protected]>
---
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;
}
--
2.17.1


2020-02-27 23:41:17

by Eric Biggers

[permalink] [raw]
Subject: Re: [PATCH] exec: remove comparision of variable i_size of type loff_t against SIZE_MAX

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 <[email protected]>
> ---
> 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

2020-02-27 23:42:18

by Al Viro

[permalink] [raw]
Subject: Re: [PATCH] exec: remove comparision of variable i_size of type loff_t against SIZE_MAX

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...

2020-02-27 23:51:36

by Scott Branden

[permalink] [raw]
Subject: Re: [PATCH] exec: remove comparision of variable i_size of type loff_t against SIZE_MAX



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?