Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1423727 > unrolled thread
| Started by | Dan Carpenter <dan.carpenter@oracle.com> |
|---|---|
| First post | 2016-06-16 09:10 +0200 |
| Last post | 2016-06-21 15:10 +0200 |
| Articles | 5 — 2 participants |
Back to article view | Back to linux.kernel
[patch] ext4: underflow in alignment check Dan Carpenter <dan.carpenter@oracle.com> - 2016-06-16 09:10 +0200
Re: [patch] ext4: underflow in alignment check Jan Kara <jack@suse.cz> - 2016-06-20 18:20 +0200
Re: [patch] ext4: underflow in alignment check Dan Carpenter <dan.carpenter@oracle.com> - 2016-06-20 22:00 +0200
Re: [patch] ext4: underflow in alignment check Jan Kara <jack@suse.cz> - 2016-06-21 09:50 +0200
Re: [patch] ext4: underflow in alignment check Dan Carpenter <dan.carpenter@oracle.com> - 2016-06-21 15:10 +0200
| From | Dan Carpenter <dan.carpenter@oracle.com> |
|---|---|
| Date | 2016-06-16 09:10 +0200 |
| Subject | [patch] ext4: underflow in alignment check |
| Message-ID | <rKzB7-5e9-9@gated-at.bofh.it> |
My static checker complains that this can underflow if arg is negative
which is true.
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index b1a3471..a2a17e9 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -1576,7 +1576,7 @@ static int handle_mount_opt(struct super_block *sb, char *opt, int token,
} else if (token == Opt_min_batch_time) {
sbi->s_min_batch_time = arg;
} else if (token == Opt_inode_readahead_blks) {
- if (arg && (arg > (1 << 30) || !is_power_of_2(arg))) {
+ if (arg && (arg > (1U << 30) || !is_power_of_2(arg))) {
ext4_msg(sb, KERN_ERR,
"EXT4-fs: inode_readahead_blks must be "
"0 or a power of 2 smaller than 2^31");
[toc] | [next] | [standalone]
| From | Jan Kara <jack@suse.cz> |
|---|---|
| Date | 2016-06-20 18:20 +0200 |
| Message-ID | <rMa5z-24j-19@gated-at.bofh.it> |
| In reply to | #1423727 |
On Thu 16-06-16 10:07:09, Dan Carpenter wrote:
> My static checker complains that this can underflow if arg is negative
> which is true.
>
> Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
How come? (1 << 30) fits even into 32-bit signed type. So where's the
problem?
Honza
> diff --git a/fs/ext4/super.c b/fs/ext4/super.c
> index b1a3471..a2a17e9 100644
> --- a/fs/ext4/super.c
> +++ b/fs/ext4/super.c
> @@ -1576,7 +1576,7 @@ static int handle_mount_opt(struct super_block *sb, char *opt, int token,
> } else if (token == Opt_min_batch_time) {
> sbi->s_min_batch_time = arg;
> } else if (token == Opt_inode_readahead_blks) {
> - if (arg && (arg > (1 << 30) || !is_power_of_2(arg))) {
> + if (arg && (arg > (1U << 30) || !is_power_of_2(arg))) {
> ext4_msg(sb, KERN_ERR,
> "EXT4-fs: inode_readahead_blks must be "
> "0 or a power of 2 smaller than 2^31");
> --
> To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
Jan Kara <jack@suse.com>
SUSE Labs, CR
[toc] | [prev] | [next] | [standalone]
| From | Dan Carpenter <dan.carpenter@oracle.com> |
|---|---|
| Date | 2016-06-20 22:00 +0200 |
| Message-ID | <rMdwt-44L-27@gated-at.bofh.it> |
| In reply to | #1426769 |
On Mon, Jun 20, 2016 at 06:02:04PM +0200, Jan Kara wrote: > On Thu 16-06-16 10:07:09, Dan Carpenter wrote: > > My static checker complains that this can underflow if arg is negative > > which is true. > > > > Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com> > > How come? (1 << 30) fits even into 32-bit signed type. So where's the > problem? Bad changelog... I was talking about a different issue. I was casting it to unsigned to take advantage of type promototion. Assume we have: int arg = 1 << 31; (arg > (1 << 30)) // <-- this is false (arg > (1U << 30)) // <-- this is true so there is no underflow. regards, dan carpenter
[toc] | [prev] | [next] | [standalone]
| From | Jan Kara <jack@suse.cz> |
|---|---|
| Date | 2016-06-21 09:50 +0200 |
| Message-ID | <rMoBz-2OV-7@gated-at.bofh.it> |
| In reply to | #1426974 |
On Mon 20-06-16 22:53:26, Dan Carpenter wrote: > On Mon, Jun 20, 2016 at 06:02:04PM +0200, Jan Kara wrote: > > On Thu 16-06-16 10:07:09, Dan Carpenter wrote: > > > My static checker complains that this can underflow if arg is negative > > > which is true. > > > > > > Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com> > > > > How come? (1 << 30) fits even into 32-bit signed type. So where's the > > problem? > > Bad changelog... I was talking about a different issue. I was casting > it to unsigned to take advantage of type promototion. Assume we have: > > int arg = 1 << 31; > > (arg > (1 << 30)) // <-- this is false > (arg > (1U << 30)) // <-- this is true so there is no underflow. I see, but match_int() - or more precisely match_number() returns -ERANGE when the number is > INT_MAX, subsequently we check whether the number is < 0 (Opt_inode_readahead_blks has flag MOPT_GTE0 set) and bail out if yes. So at the place you are modifying we are sure the number is in [0, INT_MAX]. So the condition (arg > (1 << 30)) is pointless - just defensive programming in case we decide e.g. to upgrade the type of 'arg' to long - but not wrong... Honza -- Jan Kara <jack@suse.com> SUSE Labs, CR
[toc] | [prev] | [next] | [standalone]
| From | Dan Carpenter <dan.carpenter@oracle.com> |
|---|---|
| Date | 2016-06-21 15:10 +0200 |
| Message-ID | <rMtBf-6h7-3@gated-at.bofh.it> |
| In reply to | #1427418 |
On Tue, Jun 21, 2016 at 09:43:53AM +0200, Jan Kara wrote: > On Mon 20-06-16 22:53:26, Dan Carpenter wrote: > > On Mon, Jun 20, 2016 at 06:02:04PM +0200, Jan Kara wrote: > > > On Thu 16-06-16 10:07:09, Dan Carpenter wrote: > > > > My static checker complains that this can underflow if arg is negative > > > > which is true. > > > > > > > > Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com> > > > > > > How come? (1 << 30) fits even into 32-bit signed type. So where's the > > > problem? > > > > Bad changelog... I was talking about a different issue. I was casting > > it to unsigned to take advantage of type promototion. Assume we have: > > > > int arg = 1 << 31; > > > > (arg > (1 << 30)) // <-- this is false > > (arg > (1U << 30)) // <-- this is true so there is no underflow. > > I see, but match_int() - or more precisely match_number() returns -ERANGE > when the number is > INT_MAX, subsequently we check whether the number is < > 0 (Opt_inode_readahead_blks has flag MOPT_GTE0 set) and bail out if yes. So > at the place you are modifying we are sure the number is in [0, INT_MAX]. > So the condition (arg > (1 << 30)) is pointless - just defensive > programming in case we decide e.g. to upgrade the type of 'arg' to long - but > not wrong... Ah. Smatch wasn't able to figure out that MOPT_GTE0 was set. Thanks for reviewing this. regards, dan carpenter
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web