Message ID | PUZPR04MB6316182889B5CE8003A5324981EC9@PUZPR04MB6316.apcprd04.prod.outlook.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v1] exfat: fix unexpected EOF while reading dir | expand |
> If the position is not aligned with the dentry size, the return > value of readdir() will be NULL and errno is 0, which means the > end of the directory stream is reached. > > If the position is aligned with dentry size, but there is no file > or directory at the position, exfat_readdir() will continue to > get dentry from the next dentry. So the dentry gotten by readdir() > may not be at the position. > > After this commit, if the position is not aligned with the dentry > size, round the position up to the dentry size and continue to get > the dentry. > > Fixes: ca06197382bd ("exfat: add directory operations") > > Signed-off-by: Yuezhang Mo <Yuezhang.Mo@sony.com> > Reviewed-by: Andy Wu <Andy.Wu@sony.com> > Reviewed-by: Aoyama Wataru <wataru.aoyama@sony.com> > Reported-by: Wang Yugui <wangyugui@e16-tech.com> Looks good. Thanks. Reviewed-by: Sungjong Seo <sj1557.seo@samsung.com> > --- > fs/exfat/dir.c | 5 +---- > 1 file changed, 1 insertion(+), 4 deletions(-) > > diff --git a/fs/exfat/dir.c b/fs/exfat/dir.c > index 1dfa67f307f1..1122bee3b634 100644 > --- a/fs/exfat/dir.c > +++ b/fs/exfat/dir.c > @@ -234,10 +234,7 @@ static int exfat_iterate(struct file *file, struct > dir_context *ctx) > fake_offset = 1; > } > > - if (cpos & (DENTRY_SIZE - 1)) { > - err = -ENOENT; > - goto unlock; > - } > + cpos = round_up(cpos, DENTRY_SIZE); > > /* name buffer should be allocated before use */ > err = exfat_alloc_namebuf(nb); > -- > 2.25.1
2022-12-26 16:23 GMT+09:00, Yuezhang.Mo@sony.com <Yuezhang.Mo@sony.com>: > If the position is not aligned with the dentry size, the return > value of readdir() will be NULL and errno is 0, which means the > end of the directory stream is reached. > > If the position is aligned with dentry size, but there is no file > or directory at the position, exfat_readdir() will continue to > get dentry from the next dentry. So the dentry gotten by readdir() > may not be at the position. > > After this commit, if the position is not aligned with the dentry > size, round the position up to the dentry size and continue to get > the dentry. > > Fixes: ca06197382bd ("exfat: add directory operations") > > Signed-off-by: Yuezhang Mo <Yuezhang.Mo@sony.com> > Reviewed-by: Andy Wu <Andy.Wu@sony.com> > Reviewed-by: Aoyama Wataru <wataru.aoyama@sony.com> > Reported-by: Wang Yugui <wangyugui@e16-tech.com> Applied, Thanks for your patch!
diff --git a/fs/exfat/dir.c b/fs/exfat/dir.c index 1dfa67f307f1..1122bee3b634 100644 --- a/fs/exfat/dir.c +++ b/fs/exfat/dir.c @@ -234,10 +234,7 @@ static int exfat_iterate(struct file *file, struct dir_context *ctx) fake_offset = 1; } - if (cpos & (DENTRY_SIZE - 1)) { - err = -ENOENT; - goto unlock; - } + cpos = round_up(cpos, DENTRY_SIZE); /* name buffer should be allocated before use */ err = exfat_alloc_namebuf(nb);