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

Commit b5edfd27 authored by Al Viro's avatar Al Viro
Browse files

hppfs: fix the leaks on close()



we need to close the underlying procfs file and free ->private_data

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 3dc20cb2
Loading
Loading
Loading
Loading
+12 −1
Original line number Diff line number Diff line
@@ -436,7 +436,6 @@ static int hppfs_open(struct inode *inode, struct file *file)
	path.mnt = inode->i_sb->s_fs_info;
	path.dentry = HPPFS_I(inode)->proc_dentry;

	/* XXX This isn't closed anywhere */
	data->proc_file = dentry_open(&path, file_mode(file->f_mode), cred);
	err = PTR_ERR(data->proc_file);
	if (IS_ERR(data->proc_file))
@@ -523,12 +522,23 @@ static loff_t hppfs_llseek(struct file *file, loff_t off, int where)
	return default_llseek(file, off, where);
}

static int hppfs_release(struct inode *inode, struct file *file)
{
	struct hppfs_private *data = file->private_data;
	struct file *proc_file = data->proc_file;
	if (proc_file)
		fput(proc_file);
	kfree(data);
	return 0;
}

static const struct file_operations hppfs_file_fops = {
	.owner		= NULL,
	.llseek		= hppfs_llseek,
	.read		= hppfs_read,
	.write		= hppfs_write,
	.open		= hppfs_open,
	.release	= hppfs_release,
};

struct hppfs_dirent {
@@ -582,6 +592,7 @@ static const struct file_operations hppfs_dir_fops = {
	.open		= hppfs_dir_open,
	.fsync		= hppfs_fsync,
	.llseek		= default_llseek,
	.release	= hppfs_release,
};

static int hppfs_statfs(struct dentry *dentry, struct kstatfs *sf)