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
>
next prev parent 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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.