Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f61500e0 authored by Tyler Hicks's avatar Tyler Hicks
Browse files

eCryptfs: Return error when lower file pointer is NULL

When an eCryptfs inode's lower file has been closed, and the pointer has
been set to NULL, return an error when trying to do a lower read or
write rather than calling BUG().

https://bugzilla.kernel.org/show_bug.cgi?id=37292



Signed-off-by: default avatarTyler Hicks <tyhicks@linux.vnet.ibm.com>
Cc: <stable@kernel.org>
parent 322a8b03
Loading
Loading
Loading
Loading
+10 −8
Original line number Original line Diff line number Diff line
@@ -39,15 +39,16 @@
int ecryptfs_write_lower(struct inode *ecryptfs_inode, char *data,
int ecryptfs_write_lower(struct inode *ecryptfs_inode, char *data,
			 loff_t offset, size_t size)
			 loff_t offset, size_t size)
{
{
	struct ecryptfs_inode_info *inode_info;
	struct file *lower_file;
	mm_segment_t fs_save;
	mm_segment_t fs_save;
	ssize_t rc;
	ssize_t rc;


	inode_info = ecryptfs_inode_to_private(ecryptfs_inode);
	lower_file = ecryptfs_inode_to_private(ecryptfs_inode)->lower_file;
	BUG_ON(!inode_info->lower_file);
	if (!lower_file)
		return -EIO;
	fs_save = get_fs();
	fs_save = get_fs();
	set_fs(get_ds());
	set_fs(get_ds());
	rc = vfs_write(inode_info->lower_file, data, size, &offset);
	rc = vfs_write(lower_file, data, size, &offset);
	set_fs(fs_save);
	set_fs(fs_save);
	mark_inode_dirty_sync(ecryptfs_inode);
	mark_inode_dirty_sync(ecryptfs_inode);
	return rc;
	return rc;
@@ -225,15 +226,16 @@ int ecryptfs_write(struct inode *ecryptfs_inode, char *data, loff_t offset,
int ecryptfs_read_lower(char *data, loff_t offset, size_t size,
int ecryptfs_read_lower(char *data, loff_t offset, size_t size,
			struct inode *ecryptfs_inode)
			struct inode *ecryptfs_inode)
{
{
	struct ecryptfs_inode_info *inode_info =
	struct file *lower_file;
		ecryptfs_inode_to_private(ecryptfs_inode);
	mm_segment_t fs_save;
	mm_segment_t fs_save;
	ssize_t rc;
	ssize_t rc;


	BUG_ON(!inode_info->lower_file);
	lower_file = ecryptfs_inode_to_private(ecryptfs_inode)->lower_file;
	if (!lower_file)
		return -EIO;
	fs_save = get_fs();
	fs_save = get_fs();
	set_fs(get_ds());
	set_fs(get_ds());
	rc = vfs_read(inode_info->lower_file, data, size, &offset);
	rc = vfs_read(lower_file, data, size, &offset);
	set_fs(fs_save);
	set_fs(fs_save);
	return rc;
	return rc;
}
}