Hi Marek,

On 23/07/2018 11:42, Marek Vasut wrote:
> The variable 'n' represents the number of bytes to be read from a certain
> offset in a file, to a certain offset in buffer 'buf'. The variable 'len'
> represents the length of the entire file, clamped correctly to avoid any
> overflows.
> 
> Therefore, comparing 'n' and 'len' to determine whether clearing 'n'
> bytes of the buffer 'buf' at a certain offset would clear data past
> buffer 'buf' cannot lead to a correct result, since the 'n' does not
> contain the offset from the beginning of the file.
> 
> This patch keeps track of the amount of data read and checks for the
> buffer overflow by comparing the 'n' to the remaining amount of data
> to be read instead.
> > Signed-off-by: Marek Vasut <[email protected]>
> Cc: Ian Ray <[email protected]>
> Cc: Martyn Welch <[email protected]>
> Cc: Stefano Babic <[email protected]>
> Cc: Tom Rini <[email protected]>
> Fixes: ecdfb4195b20 ("ext4: recover from filesystem corruption when reading")
> ---
>  fs/ext4/ext4fs.c | 8 +++++---
>  1 file changed, 5 insertions(+), 3 deletions(-)
> 
> diff --git a/fs/ext4/ext4fs.c b/fs/ext4/ext4fs.c
> index 2a28031d14..537aa05eff 100644
> --- a/fs/ext4/ext4fs.c
> +++ b/fs/ext4/ext4fs.c
> @@ -60,6 +60,7 @@ int ext4fs_read_file(struct ext2fs_node *node, loff_t pos,
>       lbaint_t delayed_extent = 0;
>       lbaint_t delayed_skipfirst = 0;
>       lbaint_t delayed_next = 0;
> +     lbaint_t read_total = 0;
>       char *delayed_buf = NULL;
>       short status;
>  
> @@ -140,13 +141,14 @@ int ext4fs_read_file(struct ext2fs_node *node, loff_t 
> pos,
>                                       return -1;
>                               previous_block_number = -1;
>                       }
> -                     /* Zero no more than `len' bytes. */
> +                     /* Zero no more than 'filesize' bytes. */
>                       n = blocksize - skipfirst;
> -                     if (n > len)
> -                             n = len;
> +                     if (n > (len - read_total))
> +                             n = (len - read_total);
>                       memset(buf, 0, n);
>               }
>               buf += blocksize - skipfirst;
> +             read_total += blocksize - skipfirst;
>       }
>       if (previous_block_number != -1) {
>               /* spill */
> 

Acked-by: Stefano Babic <[email protected]>
Tested-by: Stefano Babic <[email protected]>

Best regards,
Stefano Babic

-- 
=====================================================================
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: [email protected]
=====================================================================
_______________________________________________
U-Boot mailing list
[email protected]
https://lists.denx.de/listinfo/u-boot

Reply via email to