Skip to content

Commit 4f165b1

Browse files
fs/ntfs3: zero stale pagecache beyond valid data length
Zero cached folios beyond the valid data length when closing a writable mapping. This keeps cached data beyond initialized file contents zeroed and prevents stale pagecache exposure after mmap-based writes. Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
1 parent 33f29fc commit 4f165b1

1 file changed

Lines changed: 28 additions & 2 deletions

File tree

fs/ntfs3/file.c

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -323,18 +323,44 @@ static int ntfs_extend_initialized_size(struct file *file,
323323
return 0;
324324
}
325325

326+
/* Zero pagecache after 'from'. */
327+
static void ntfs_zero_tail(struct address_space *mapping, loff_t from)
328+
{
329+
struct folio_batch fbatch;
330+
pgoff_t index = from >> PAGE_SHIFT;
331+
unsigned nr, i;
332+
333+
folio_batch_init(&fbatch);
334+
335+
nr = filemap_get_folios(mapping, &index, -1, &fbatch);
336+
337+
for (i = 0; i < nr; i++) {
338+
struct folio *folio = fbatch.folios[i];
339+
u32 st = folio_pos(folio) < from ?
340+
offset_in_folio(folio, from) :
341+
0;
342+
343+
folio_lock(folio);
344+
folio_zero_segment(folio, st, folio_size(folio));
345+
346+
folio_unlock(folio);
347+
}
348+
folio_batch_release(&fbatch);
349+
}
350+
326351
static void ntfs_filemap_close(struct vm_area_struct *vma)
327352
{
328353
struct inode *inode = file_inode(vma->vm_file);
329354
struct ntfs_inode *ni = ntfs_i(inode);
355+
u64 i_size = i_size_read(inode);
330356
u64 from = (u64)vma->vm_pgoff << PAGE_SHIFT;
331-
u64 to = min_t(u64, i_size_read(inode),
332-
from + vma->vm_end - vma->vm_start);
357+
u64 to = min(i_size, from + vma->vm_end - vma->vm_start);
333358

334359
if (ni->i_valid < to) {
335360
ni->i_valid = to;
336361
mark_inode_dirty(inode);
337362
}
363+
ntfs_zero_tail(inode->i_mapping, ni->i_valid);
338364
}
339365

340366
/* Copy of generic_file_vm_ops. */

0 commit comments

Comments
 (0)