From: AMIT SAHRAWAT <a.sahrawat@samsung.com>
To: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>,
Anupam Aggarwal <anupam.al@samsung.com>
Cc: "linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: RE:(2) [PATCH] fs: fat: add check for dir size in fat_calc_dir_size
Date: Tue, 30 Jun 2020 18:03:55 +0530 [thread overview]
Message-ID: <20200630123355epcms5p602efe0e4ceedcfe11eae2153c8466678@epcms5p6> (raw)
In-Reply-To: <87ftacolpf.fsf@mail.parknet.co.jp>
There are many implementation that doesn't follow the spec strictly. And
when I tested in past, Windows also allowed to read the directory beyond
that limit. I can't recall though if there is in real case or just test
case though.
>> Thanks Ogawa, yes there are many implementations, preferably going around with different variants.
But, using standard linux version on the systems and having such USB connected on such systems is introducing issues(importantly because these being used on Windows also by users).
I am not sure, if this is something which is new from Windows part.
But, surely extending the directory beyond limit is causing regression with FAT usage on linux.
It is making FAT filesystem related storage virtually unresponsive for minutes in these cases,
and importantly keep on putting pressure on memory due to increasing buffer heads (already a known one with FAT fs).
So if there is no strong reason to apply the limit, I don't think it is
good to limit it.
>> The reason for us to share this is because of the unresponsive behaviour observed with FAT fs on our systems.
This is not a new issue, we have been observing this for quite sometime (may be around 1year+).
Finally, we got hold of disk which is making this 100% reproducible.
We thought of applying this to the mainline, as our FAT is aligned with main kernel.
(btw, the current code should detect the corruption of
infinite loop already)
>>
No, there are no such error reported on our side.
We had to trace to check the point of stuck in simple 'ls -lR'.
Thanks & Regards,
Amit Sahrawat
--------- Original Message ---------
Sender : OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
Date : 2020-06-30 16:38 (GMT+5:30)
Title : Re: [PATCH] fs: fat: add check for dir size in fat_calc_dir_size
Anupam Aggarwal <anupam.al@samsung.com> writes:
> Max directory size of FAT filesystem is FAT_MAX_DIR_SIZE(2097152 bytes)
> It is possible that, due to corruption, directory size calculated in
> fat_calc_dir_size() can be greater than FAT_MAX_DIR_SIZE, i.e.
> can be in GBs, hence directory traversal can take long time.
> for example when command "ls -lR" is executed on corrupted FAT
> formatted USB, fat_search_long() function will lookup for a filename from
> position 0 till end of corrupted directory size, multiple such lookups
> will lead to long directory traversal
>
> Added sanity check for directory size fat_calc_dir_size(),
> and return EIO error, which will prevent lookup in corrupted directory
>
> Signed-off-by: Anupam Aggarwal <anupam.al@samsung.com>
> Signed-off-by: Amit Sahrawat <a.sahrawat@samsung.com>
There are many implementation that doesn't follow the spec strictly. And
when I tested in past, Windows also allowed to read the directory beyond
that limit. I can't recall though if there is in real case or just test
case though.
So if there is no strong reason to apply the limit, I don't think it is
good to limit it. (btw, the current code should detect the corruption of
infinite loop already)
Thanks.
> ---
> fs/fat/inode.c | 7 +++++++
> 1 file changed, 7 insertions(+)
>
> diff --git a/fs/fat/inode.c b/fs/fat/inode.c
> index a0cf99d..9b2e81e 100644
> --- a/fs/fat/inode.c
> +++ b/fs/fat/inode.c
> @@ -490,6 +490,13 @@ static int fat_calc_dir_size(struct inode *inode)
> return ret;
> inode->i_size = (fclus + 1) << sbi->cluster_bits;
>
> + if (i_size_read(inode) > FAT_MAX_DIR_SIZE) {
> + fat_fs_error(inode->i_sb,
> + "%s corrupted directory (invalid size %lld)\n",
> + __func__, i_size_read(inode));
> + return -EIO;
> + }
> +
> return 0;
> }
--
OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
next prev parent reply other threads:[~2020-06-30 12:42 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <CGME20200629110320epcas5p34ccccc7c293f077b34b350935c328215@epcas5p3.samsung.com>
2020-06-29 11:02 ` Anupam Aggarwal
2020-06-30 11:08 ` OGAWA Hirofumi
[not found] ` <CGME20200629110320epcas5p34ccccc7c293f077b34b350935c328215@epcms5p6>
2020-06-30 12:33 ` AMIT SAHRAWAT [this message]
2020-06-30 16:26 ` (2) " OGAWA Hirofumi
[not found] ` <CGME20200629110320epcas5p34ccccc7c293f077b34b350935c328215@epcms5p8>
2020-06-30 17:07 ` AMIT SAHRAWAT
[not found] ` <CGME20200629110320epcas5p34ccccc7c293f077b34b350935c328215@epcms5p1>
2020-07-03 14:29 ` Anupam Aggarwal
2020-07-03 19:11 ` OGAWA Hirofumi
[not found] ` <CGME20200629110320epcas5p34ccccc7c293f077b34b350935c328215@epcms5p2>
2020-07-06 11:53 ` Anupam Aggarwal
2020-07-06 14:22 ` OGAWA Hirofumi
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=20200630123355epcms5p602efe0e4ceedcfe11eae2153c8466678@epcms5p6 \
--to=a.sahrawat@samsung.com \
--cc=anupam.al@samsung.com \
--cc=hirofumi@mail.parknet.co.jp \
--cc=linux-kernel@vger.kernel.org \
/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
all inboxes | Powered by JetHome®