[U-Boot] [PATCH] fs: ext4: Prevent erasing buffer past file size
Stefano Babic
sbabic at denx.de
Mon Jul 23 12:30:02 UTC 2018
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 <marex at denx.de>
> Cc: Ian Ray <ian.ray at ge.com>
> Cc: Martyn Welch <martyn.welch at collabora.co.uk>
> Cc: Stefano Babic <sbabic at denx.de>
> Cc: Tom Rini <trini at konsulko.com>
> 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 <sbabic at denx.de>
Tested-by: Stefano Babic <sbabic at denx.de>
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: sbabic at denx.de
=====================================================================
More information about the U-Boot
mailing list