eCryptfs: Fix kernel bug for writing mmaped non-eCryptfs file
Subsystems (2)
PATCH 1/1 eCryptfs: Fix kernel bug for writing mmaped non-eCryptfs file
eCryptfs did not handle the writing for mmaped non-eCryptfs file. Instead, it put BUG_ON(!(crypt_stat->flags & ECRYPTFS_ENCRYPTED)) on ecryptfs_writepage call path. This patch enables eCryptfs to deal with such case, to fully support non-eCryptfs operations as it claims.
---
To make the bug present
cd cipher // enter eCryptfs cipher text folder
echo "123" > foo // make non-eCryptfs file
cd ..
mount -t ecryptfs cipher plain -o ecryptfs_passthrough // allow for non-eCryptfs files to be read and written from within an eCryptfs mount cd plain
run the following program
int main()
{
int fd = open("foo", O_RDWR);
char * addr;
addr = (char *)mmap(NULL, 256, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
add[0] = '3';
munmap(addr, 256);
close(fd);
return 0;
}Signed-off-by Li Wang <[email protected]>
Signed-off-by Yunchuan Wen <[email protected]>
--- fs/ecryptfs/mmap.c | 26 ++++++++++++++++++++++++++ 1 files changed, 26 insertions(+), 0 deletions(-)
fs/ecryptfs/mmap.c +26 -0
@@ -65,6 +65,32 @@ struct page *ecryptfs_get_locked_page(struct inode *inode, loff_t index)static int ecryptfs_writepage (struct page *page,struct writeback_control *wbc) {int rc; +struct inode *inode; +struct ecryptfs_crypt_stat *crypt_stat; + + inode = page->mapping->host; + crypt_stat = &ecryptfs_inode_to_private (inode)->crypt_stat; +if (!(crypt_stat->flags &ECRYPTFS_ENCRYPTED )) { +size_t size; +loff_t file_size =i_size_read (inode); +pgoff_t end_page_index = file_size >>PAGE_CACHE_SHIFT ; + +if (end_page_index < page->index) + size =0 ; +else if (end_page_index == page->index) + size = file_size & ~PAGE_CACHE_MASK ; +else + size =PAGE_CACHE_SIZE ; + + rc =ecryptfs_write_lower_page_segment (inode, page,0 , size); +if (unlikely (rc)) { +ecryptfs_printk (KERN_WARNING ,"Error write " +"page (upper index [0x%.16lx])\n" , page->index); +ClearPageUptodate (page); + }else +SetPageUptodate (page); + goto out; + }/* * Refuse to write the page out if we are called from reclaim context
Signature · 1 line
1.7.6.5