Hi Tom,

On Mon, May 26, 2025 at 3:25 PM Tom Rini <tr...@konsulko.com> wrote:
>
> On Thu, May 22, 2025 at 10:02:01PM -0700, Tony Dinh wrote:
>
> > Use lbaint_t for blknr to avoid overflow in ext4fs_read_file().
> >
> > Background:
> >
> > blknr (block number) used in ext4fs_read_file() could be increased to a
> > very large value and causes a wrap around at 32 bit signed integer max,
> > thus becomes negative. This results in an out-of-normal range for sector
> > number (during the assignment delayed_start = blknr) where delayed_start
> > sector is typed uint64 lbaint_t. This causes the "Read outside partition"
> > error.
> >
> > This patch was tested on the Synology DS116 (Armada 385) board, and a
> > 4TB Seagate HDD.
> >
> > Signed-off-by: Tony Dinh <mibo...@gmail.com>
> > ---
> >
> >  fs/ext4/ext4fs.c | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/fs/ext4/ext4fs.c b/fs/ext4/ext4fs.c
> > index 1727da2dc6d..f10c622e62c 100644
> > --- a/fs/ext4/ext4fs.c
> > +++ b/fs/ext4/ext4fs.c
> > @@ -101,7 +101,7 @@ int ext4fs_read_file(struct ext2fs_node *node, loff_t 
> > pos,
> >       blockcnt = lldiv(((len + pos) + blocksize - 1), blocksize);
> >
> >       for (i = lldiv(pos, blocksize); i < blockcnt; i++) {
> > -             long int blknr;
> > +             lbaint_t blknr;
> >               int blockoff = pos - (blocksize * i);
> >               int blockend = blocksize;
> >               int skipfirst = 0;
>
> Sorry, I should have reviewed this deeper before accepting it. This
> patch isn't right because it introduces a new problem, we ignore all
> failures from read_allocated_block() now because we can never return a
> negative value. This was reported by Coverity as CID 131183 and I need
> to revert this for now.

Thanks! Indeed that was bad. I'll take a look again.

All the best,
Tony


>
> --
> Tom

Reply via email to