aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaegeuk Kim <jaegeuk@kernel.org>2016-02-12 14:29:28 -0800
committerMister Oyster <oysterized@gmail.com>2017-04-13 12:33:02 +0200
commitf1cfdec17c27db8461d76cd37edf4bf7f1bc64d1 (patch)
treee64159b672d9c75d1e2ee71f9628965b70dc5de7
parent74163adf43237488522cb4e1ffea1ca1a302fdc3 (diff)
f2fs: avoid garbage lenghs in dentries
This patch fixes to eliminate garbage name lengths in dentries in order to provide correct answers of readdir. For example, if a valid dentry consists of: bitmap : 1 1 1 1 len : 32 0 x 0, readdir can start with second bit_pos having len = 0. Or, it can start with third bit_pos having garbage. In both of cases, we should avoid to try filling dentries. So, this patch not only removes any garbage length, but also avoid entering zero length case in readdir. Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
-rw-r--r--fs/f2fs/dir.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/fs/f2fs/dir.c b/fs/f2fs/dir.c
index 7a4c742aa..547d3477d 100644
--- a/fs/f2fs/dir.c
+++ b/fs/f2fs/dir.c
@@ -513,8 +513,12 @@ void f2fs_update_dentry(nid_t ino, umode_t mode, struct f2fs_dentry_ptr *d,
memcpy(d->filename[bit_pos], name->name, name->len);
de->ino = cpu_to_le32(ino);
set_de_type(de, mode);
- for (i = 0; i < slots; i++)
+ for (i = 0; i < slots; i++) {
test_and_set_bit_le(bit_pos + i, (void *)d->bitmap);
+ /* avoid wrong garbage data for readdir */
+ if (i)
+ (de + i)->name_len = 0;
+ }
}
/*
@@ -797,6 +801,11 @@ bool f2fs_fill_dentries(struct file *file, void *dirent, filldir_t filldir,
de = &d->dentry[bit_pos];
+ if (de->name_len == 0) {
+ bit_pos++;
+ continue;
+ }
+
if (types && de->file_type < F2FS_FT_MAX)
d_type = types[de->file_type];