public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: AKASHI Takahiro <takahiro.akashi@linaro.org>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 1/2] fs: fat: treat invalid FAT clusters as errors
Date: Wed, 18 Sep 2019 13:37:02 +0900	[thread overview]
Message-ID: <20190918043701.GC4398@linaro.org> (raw)
In-Reply-To: <20190912171930.17163-2-xypron.glpk@gmx.de>

On Thu, Sep 12, 2019 at 07:19:29PM +0200, Heinrich Schuchardt wrote:
> When hitting an invalid FAT cluster while reading a file always print an
> error message and return an error code.

I don't know what the intention of original author was here.

In general, a cluster's FAT entry points to a next cluster
which composes part of a file and hence a chain of clusters.
The last cluster's FAT is marked with EOC(End of Cluster),
which has a dedicated value, for fat16, one of 0xfff8:0xffff.

As you can see, those values are also detected by CHECK_CLUST() macro.
I'm afraid that, at least initially, this macro might have worked
for detecting a file end correctly (so returned 0?).

Another issue is that CHECK_CLUST() checks against >0xfff0 for fat16
while 0xfff0:0xfff6 are still valid for cluster numbers.
So it will potentially detect a wrong "invalid" FAT entry for
a quite large file.

Thanks,
-Takahiro Akashi

> Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
> ---
>  fs/fat/fat.c | 30 ++++++++++++++++++++----------
>  1 file changed, 20 insertions(+), 10 deletions(-)
> 
> diff --git a/fs/fat/fat.c b/fs/fat/fat.c
> index 73a89fc9e3..b4e8083734 100644
> --- a/fs/fat/fat.c
> +++ b/fs/fat/fat.c
> @@ -301,10 +301,20 @@ get_cluster(fsdata *mydata, __u32 clustnum, __u8 *buffer, unsigned long size)
>  	return 0;
>  }
> 
> -/*
> +/**
> + * get_contents() - read from file
> + *
>   * Read at most 'maxsize' bytes from 'pos' in the file associated with 'dentptr'
> - * into 'buffer'.
> - * Update the number of bytes read in *gotsize or return -1 on fatal errors.
> + * into 'buffer'. Update the number of bytes read in *gotsize or return -1 on
> + * fatal errors.
> + *
> + * @mydata:	file system description
> + * @dentprt:	directory entry pointer
> + * @pos:	position from where to read
> + * @buffer:	buffer into which to read
> + * @maxsize:	maximum number of bytes to read
> + * @gotsize:	number of bytes actually read
> + * Return:	-1 on error, otherwise 0
>   */
>  static int get_contents(fsdata *mydata, dir_entry *dentptr, loff_t pos,
>  			__u8 *buffer, loff_t maxsize, loff_t *gotsize)
> @@ -335,8 +345,8 @@ static int get_contents(fsdata *mydata, dir_entry *dentptr, loff_t pos,
>  		curclust = get_fatent(mydata, curclust);
>  		if (CHECK_CLUST(curclust, mydata->fatsize)) {
>  			debug("curclust: 0x%x\n", curclust);
> -			debug("Invalid FAT entry\n");
> -			return 0;
> +			printf("Invalid FAT entry\n");
> +			return -1;
>  		}
>  		actsize += bytesperclust;
>  	}
> @@ -374,8 +384,8 @@ static int get_contents(fsdata *mydata, dir_entry *dentptr, loff_t pos,
>  		curclust = get_fatent(mydata, curclust);
>  		if (CHECK_CLUST(curclust, mydata->fatsize)) {
>  			debug("curclust: 0x%x\n", curclust);
> -			debug("Invalid FAT entry\n");
> -			return 0;
> +			printf("Invalid FAT entry\n");
> +			return -1;
>  		}
>  	}
> 
> @@ -390,8 +400,8 @@ static int get_contents(fsdata *mydata, dir_entry *dentptr, loff_t pos,
>  				goto getit;
>  			if (CHECK_CLUST(newclust, mydata->fatsize)) {
>  				debug("curclust: 0x%x\n", newclust);
> -				debug("Invalid FAT entry\n");
> -				return 0;
> +				printf("Invalid FAT entry\n");
> +				return -1;
>  			}
>  			endclust = newclust;
>  			actsize += bytesperclust;
> @@ -418,7 +428,7 @@ getit:
>  		if (CHECK_CLUST(curclust, mydata->fatsize)) {
>  			debug("curclust: 0x%x\n", curclust);
>  			printf("Invalid FAT entry\n");
> -			return 0;
> +			return -1;
>  		}
>  		actsize = bytesperclust;
>  		endclust = curclust;
> --
> 2.23.0
> 

  reply	other threads:[~2019-09-18  4:37 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-09-12 17:19 [U-Boot] [PATCH 0/2] fs: fat: error handling in get_contents() Heinrich Schuchardt
2019-09-12 17:19 ` [U-Boot] [PATCH 1/2] fs: fat: treat invalid FAT clusters as errors Heinrich Schuchardt
2019-09-18  4:37   ` AKASHI Takahiro [this message]
2019-10-12 20:28   ` Tom Rini
2019-09-12 17:19 ` [U-Boot] [PATCH 2/2] fs: fat: get_contents() always returns -1 for errors Heinrich Schuchardt
2019-10-12 20:28   ` Tom Rini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190918043701.GC4398@linaro.org \
    --to=takahiro.akashi@linaro.org \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox