@@ -773,6 +773,7 @@ bool f2fs_fill_dentries(struct dir_context *ctx, struct f2fs_dentry_ptr *d,
unsigned int bit_pos;
struct f2fs_dir_entry *de = NULL;
struct f2fs_str de_name = FSTR_INIT(NULL, 0);
+ char *name = NULL;
bit_pos = ((unsigned long)ctx->pos % d->max);
@@ -788,8 +789,10 @@ bool f2fs_fill_dentries(struct dir_context *ctx, struct f2fs_dentry_ptr *d,
d_type = DT_UNKNOWN;
/* encrypted case */
- de_name.name = d->filename[bit_pos];
de_name.len = le16_to_cpu(de->name_len);
+ name = kmalloc(de_name.len, GFP_NOFS);
+ memcpy(name, d->filename[bit_pos], de_name.len);
+ de_name.name = name;
if (f2fs_encrypted_inode(d->inode)) {
int save_len = fstr->len;
@@ -799,13 +802,18 @@ bool f2fs_fill_dentries(struct dir_context *ctx, struct f2fs_dentry_ptr *d,
&de_name, fstr);
de_name = *fstr;
fstr->len = save_len;
- if (ret < 0)
+ if (ret < 0) {
+ kfree(name);
return true;
+ }
}
if (!dir_emit(ctx, de_name.name, de_name.len,
- le32_to_cpu(de->ino), d_type))
+ le32_to_cpu(de->ino), d_type)) {
+ kfree(name);
return true;
+ }
+ kfree(name);
bit_pos += GET_DENTRY_SLOTS(le16_to_cpu(de->name_len));
ctx->pos = start_pos + bit_pos;